是否可以使用eval命令执行具有全局范围的内容?例如,这将导致错误:
<script>
function execute(x){
eval(x);
}
function start(){
execute("var ary = new Array()");
execute("ary.push('test');"); // This will cause exception: ary is not defined
}
</script>
<html><body onLoad="start()"></body></html>
我知道'with'关键字会设置一个特定的范围,但是全局范围是否有关键字?或者是否可以定义允许其工作的自定义范围?
<script>
var scope = {};
function execute(x){
with(scope){
eval(x);
}
}
function start(){
execute("var ary = new Array()");
execute("ary.push('test');"); // This will cause exception: ary is not defined
}
</script>
<html><body onLoad="start()"></body></html>
基本上,我要做的是拥有全局执行功能...
答案 0 :(得分:36)
(function(){
eval.apply(this, arguments);
}(a,b,c))
这将使用浏览器中的全局对象window
调用eval,作为this
参数传递您传递给匿名函数的任何参数。
eval.call(window, x, y, z)
是全局对象,则 eval.apply(window, arguments)
或window
也有效。然而,这并非总是如此。例如,如果我没记错的话,Node.js脚本中的全局对象是process
。
答案 1 :(得分:6)
您可以通过间接调用它来在全局范围内使用eval()
。但是,并非所有浏览器目前都在这样做。
答案 2 :(得分:5)
使用(1, eval)('...')
。
$ node
> fooMaker = function () { (1, eval)('foo = "bar"'); };
[Function]
> typeof foo
'undefined'
> fooMaker()
undefined
> typeof foo
'string'
> foo
'bar'
答案 3 :(得分:2)
要在全局范围内执行某些JavaScript,您可以使用setTimeout()间接调用它,或者如果您使用的是jQuery,请查看$.globalEval()。
将执行方法更改为以下内容将允许您仍然使用'var'关键字:
function execute(x) {
setTimeout("eval(" + x + ")", 0);
// Or: $.globalEval(x);
}
function start() {
try
{
execute("var ary = new Array()");
execute("ary.push('test');");
}
catch (e)
{
alert(e);
}
}
start();
答案 4 :(得分:1)
我知道将会有很多评论与eval是邪恶的,我同意这一点。 但是,要回答您的问题,请按以下步骤更改启动方法:
function start(){
execute("ary = new Array()");
execute("ary.push('test');"); // This will cause exception: ary is not defined
}
答案 5 :(得分:1)
使用eval.apply(null, ["code"]);
。
eval.apply(this, ["code"]);
无法在Microsoft脚本宿主(cscript.exe)上运行。