让eval()全局作用域执行的方法深入研究(javascript)
eval(str)
用来传入一个字符串动态执行一段脚本,这个方法非常有用。当直接用eval()时,作用域为当前作用域,有时候我们需要让它在全局作用域范围内执行,比如
ajax返回的脚本字符串,然而浏览器对eval的差异可能使事情刚开始并不是那么顺利,本文通过在7种浏览器(IE, Firefox,
Chrome, Safari, Opera)环境中测试,并提出三种解决方案,使这个问题比较完美的解决。
看这一段javascript代码:
function
xx(){
var
x=
1
;
window
.eval(
'var x=3;'
);
document
.writeln(x);
}
xx();
在你自己测试和看我接下来的分析之前,先想想,你认为输出结果会是什么呢?是1还是3?
根据本文的标题,可知肯定是在不同浏览器下有不同表现的。
以下是我的实测数据:
JS代码
function
xx(){
var
x=
1
;
window
.eval
(
'var x=3;'
);
document
.writeln
(x);
}
xx();
浏览器
IE
IE
Firefox
Chrome
Chrome
Safari
Opera
版本
7.0
8.0
3.0.8
1.0
4.0
4.0.2
9.62
运行结果
3
3
1
3
1
1
1
可见各浏览器及版本对window.eval()的作用域处理是有差异的。
IE中,window.eval()和eval()一样只在当前作用域生效。
Firefox,Safari,Opera中,直接调用eval()为当前作用域,window.eval()调用为全局作用域。
尤其值得注意的是,Google Chrome 的不同版本之间对于eval的处理也有差异。
如果需要在全局作用域eval()的效果,且通用于所有浏览器,那就得好好变通一下了。
方法之一:
使用IE专有的window
.execScript
。
如果你碰到这个问题不知所措,并上网搜索,这个方法大概是最先也几乎唯一能搜索到的方法。
window
.execScript
(sExpression
,
sLanguage
)。
比如上面那一段代码中eval一句如果换成window
.execScript(
'var x=3;'
);
IE中的运行结果就是1了。
非IE内核的浏览器并不支持window
.execScript
。
IE之所以有这个window
.execScript
,还和IE能够执行其他语言的脚本有关,通过给不同的sLanguage
参数,IE这个方法除能够执行javascript之外,还可以执行vbscript或是其他任何安装过相应解释引擎的脚本如perl,python等。
当需要在局部环境中执行的时候,我们就直接用eval()。
当需要在全局环境中执行的时候,我们可以封装一个通用的函数
相关文档:
上篇介绍了用C++调用JavaScript,这篇反过来说说JS调C++,这样JS和C++沟通的途径就完整了。
首先,实现一个IDispatch接口,当JS调用C++函数时,系统会调用GetIDsOfNames来用函数名取得函数的DISPID,然后调用Invoke完成真正的调用,需要注意的是Invoke的pDispParams中的参数是倒序的。代码如下:
class CExtenalDis ......
来自:http://www.tripwiremagazine.com/tools/developer-toolbox/top-10-javascript-frameworks-by-google.html
Wed, Nov 11, 2009
Development
, Javascript
, Tools
JavaScript – an indispensable part for developing websites and web
pages, whether th ......
click() 对象.click() 使对象被点击。
closed 对象.closed 对象窗口是否已关闭true/false
clearTimeout(对象) 清除已设置的setTimeout对象
clearInterval(对象) 清除已设置的setInterval对象
confirm("提示信息") 弹出确认框,确 ......
javascript中有一种方法叫做泛化方法,指那种原生对象不可遍历的原型方法。如Array的pop,slice等。我们必须知道它们的名字才能调用它或者把它挖出来。假如我们想设计一个类,拥有与String同样的功能,我们就有这需要。不如放开点说,为什么要设计这个类吧,显然String2的效率不如原生的,但事情总要往两面看。正如C#不如二 ......