让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 ......
//由页面元素date_string(YYYY-MM_DD格式)得到数组date_array
//输入参数:date_string:日期串;marker:日期串date_string里的分隔符,如果没有则为"";
//返回值: 数组:date_array
// 数组元素date_array.year=YYYY;dat ......