全球范围内的Javascript评估?

时间:2011-01-12 15:52:50

标签: javascript scope

是否可以使用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>

基本上,我要做的是拥有全局执行功能...

6 个答案:

答案 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()。但是,并非所有浏览器目前都在这样做。

Further Reading

答案 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)上运行。