全局范围上的Javascript评估?

全局范围上的Javascript评估?,javascript,scope,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> <htm

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

函数执行(x){
eval(x);
}
函数start(){
执行(“var ary=new Array()”;
执行(“ari.push('test');”;//这将导致异常:未定义ari
}
我知道'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>

var作用域={};
函数执行(x){
(范围){
eval(x);
}
}
函数start(){
执行(“var ary=new Array()”;
执行(“ari.push('test');”;//这将导致异常:未定义ari
}

本质上,我想做的是有一个全局执行函数…

我知道会有很多评论,eval是邪恶的,我同意这一点。 但是,要回答您的问题,请按以下方式更改启动方法:

function start(){   
  execute("ary = new Array()");   
  execute("ary.push('test');");  // This will cause exception: ary is not defined  
} 
这将在浏览器中使用全局对象
window
调用eval,作为
This
参数传递您传递到匿名函数中的任何参数


eval.call(window,x,y,z)
eval.apply(window,arguments)
如果确定
window
是全局对象,则也有效。然而,这并不总是正确的。例如,如果我没记错的话,Node.js脚本中的全局对象是
process

您应该能够通过间接调用它在全局范围中使用
eval()
。但是,目前并非所有浏览器都在这样做


将execute方法更改为以下将允许您仍然使用'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();
使用
(1,eval)(“…”)

使用
eval.apply(null,[“code”])

eval.apply(这个,[“code]”)在Microsoft脚本主机(cscript.exe)上不工作

例如:

> type test.js
eval.apply(null, ["a=3;"]);
WScript.Echo(a);

> cscript test.js
Microsoft (R) Windows Script Host 버전 5.812
Copyright (C) Microsoft Corporation. All rights reserved.

3

eval.call(windwow,x)为我工作,跨浏览器实现。原因是,全局作用域应该始终是
window
对象,随后定义的函数将与此对象相关,如
JSON。例如,stringify
就是
window['JSON']['stringify']
和event
window['window']['window']['window']['window']['JSON'['stringify'][/code>;这两种方法仍然有效。这真的很有帮助!调用我的函数在本地设置了“Date”,我需要Date对象的全局版本,即window.Date.-1。阅读真正发生的事情。你需要正确地引用x中的任何内容(并且在x之后省略了一个
+
$.globalEval(x)工作得很好。更多信息请访问我不确定这是什么样的黑魔法,但它的效果非常好。我很想了解这里到底发生了什么,你能解释一下吗?:)@冈萨洛拉尔德:这两个似乎都不适用于cscript上下文(以及这里假设我们在浏览器中的所有其他“答案”)。
$ node
> fooMaker = function () { (1, eval)('foo = "bar"'); };
[Function]
> typeof foo
'undefined'
> fooMaker()
undefined
> typeof foo
'string'
> foo
'bar'
> type test.js
eval.apply(null, ["a=3;"]);
WScript.Echo(a);

> cscript test.js
Microsoft (R) Windows Script Host 버전 5.812
Copyright (C) Microsoft Corporation. All rights reserved.

3