eval(str)是把传入的str当做脚本来执行,如果直接调用eval(),作用域为当前作用域。
执行结果:3
如果改成window.eval():
在不同的浏览器上结果不同:
[table]
| 浏览器 | IE | IE | IE | Firefox | Chrome | Chrome | Safari | Opera |
| 版本 | 7.0 | 8.0 | 9.0 | 3.5.5 | 1.0 | 4.0 | 4.0.2 | 9.62 |
| 运行结果 | 3 | 3 | 1 | 3 | 1 | 1 | 1 |
[/table]
可见各浏览器及版本对window.eval()的作用域处理是有差异的。
IE中,window.eval()和eval()一样只在当前作用域生效。
Firefox,Safari,Opera中,直接调用eval()为当前作用域,window.eval()调用为全局作用域。
尤其值得注意的是,Google Chrome 的不同版本之间对于eval的处理也有差异。
如果需要全局作用域eval()的效果,就需要进行改进:
[size=x-large]1. 使用IE专有的window.execScript()[/size]
window.execScript(sExpression, sLanguage)
这里的sExpression就是需要执行的脚本字符串,sLanguage是指使用哪种脚本语言:如javascript, vbscript或是其他任何安装过相应解释引擎的脚本如perl,python等。
非IE内核不支持这个命令
看起来,问题似乎圆满解决了。但是显然是有问题的,比如上表中的Chrome 1.0也和IE的eval()规则一致,况且还不知道其他浏览器其他版本是否有差异呢,因此,这种方法并不很可靠。
[size=x-large]2. 新建一个<script>元素装载脚本[/size]
这个方法需要新增一个<script>元素,但优点是各种浏览器及版本通用,缺点是毕竟添加了一个HTML元素嘛,影响了页面原本的DOM结构。
[size=x-large]3. 使用with[/size]
with可以改变上下文环境:
[size=large]特别[/size]
有时候,我们eval()要求既不是在全局执行,也不是在当前作用域执行,而是在父对象或子对象中执行,这时,用 with ( objContext )eval (strScript) 就更加是不可替代的选择了。
[size=x-large]总结[/size]
让eval()全局作用域执行的方法主要有:
(1)window .execScript + window . eval 级别:弱。 缺点:不简洁,不可靠,不通用。
(2)document . createElement ("script" ) 级别:凑合。缺点:不简洁,不干净。优点:可靠,通用。
(3)with ( objContext )eval (strScript) 级别:最佳。优点:简洁,干净,可靠,通用。
function accumulate() {
var i = 1;
eval("var i = 3;");
document.writeln(i);
}
accumulate();
执行结果:3
如果改成window.eval():
function accumulate() {
var i = 1;
window.eval("var i = 3;");
document.writeln(i);
}
accumulate();
在不同的浏览器上结果不同:
[table]
| 浏览器 | IE | IE | IE | Firefox | Chrome | Chrome | Safari | Opera |
| 版本 | 7.0 | 8.0 | 9.0 | 3.5.5 | 1.0 | 4.0 | 4.0.2 | 9.62 |
| 运行结果 | 3 | 3 | 1 | 3 | 1 | 1 | 1 |
[/table]
可见各浏览器及版本对window.eval()的作用域处理是有差异的。
IE中,window.eval()和eval()一样只在当前作用域生效。
Firefox,Safari,Opera中,直接调用eval()为当前作用域,window.eval()调用为全局作用域。
尤其值得注意的是,Google Chrome 的不同版本之间对于eval的处理也有差异。
如果需要全局作用域eval()的效果,就需要进行改进:
[size=x-large]1. 使用IE专有的window.execScript()[/size]
window.execScript(sExpression, sLanguage)
这里的sExpression就是需要执行的脚本字符串,sLanguage是指使用哪种脚本语言:如javascript, vbscript或是其他任何安装过相应解释引擎的脚本如perl,python等。
非IE内核不支持这个命令
// To execute in global environment
function evalGlobal(strScript) {
if (window.execScript) window.execScript(strScript);
else window.eval(strScript);
}
看起来,问题似乎圆满解决了。但是显然是有问题的,比如上表中的Chrome 1.0也和IE的eval()规则一致,况且还不知道其他浏览器其他版本是否有差异呢,因此,这种方法并不很可靠。
[size=x-large]2. 新建一个<script>元素装载脚本[/size]
// To execute in global environment
function evalGlobal(strScript) {
var s = document.createElement("script");
s.type = "text/javascript";
s.text = strScript;
document.getElementsByTagName("head")[0].appendChild(s);
}
这个方法需要新增一个<script>元素,但优点是各种浏览器及版本通用,缺点是毕竟添加了一个HTML元素嘛,影响了页面原本的DOM结构。
[size=x-large]3. 使用with[/size]
with可以改变上下文环境:
function evalGlobal(strScript) {
with (window) eval(strScript);
}
[size=large]特别[/size]
有时候,我们eval()要求既不是在全局执行,也不是在当前作用域执行,而是在父对象或子对象中执行,这时,用 with ( objContext )eval (strScript) 就更加是不可替代的选择了。
[size=x-large]总结[/size]
让eval()全局作用域执行的方法主要有:
(1)window .execScript + window . eval 级别:弱。 缺点:不简洁,不可靠,不通用。
(2)document . createElement ("script" ) 级别:凑合。缺点:不简洁,不干净。优点:可靠,通用。
(3)with ( objContext )eval (strScript) 级别:最佳。优点:简洁,干净,可靠,通用。