全局范围上的Javascript评估?
是否可以使用eval命令执行具有全局范围的内容?例如,这将导致错误:全局范围上的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
<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']
和eventwindow['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