我正在进行我的工作者远程方法调用和类实例化,我正在使用闭包进行一些eval研究。我带来了我真正喜欢的代码,我会使用它,但不是很清楚为什么它有效以及它是如何工作的。实际上,我并不了解' a'存储变量,并存储其名称,因为我可以在函数内部或通过调用evals来访问它。此外,我想知道它的生命周期是什么,什么时候会被摧毁。它是JS引擎的黑客还是它的有效用法?我测试了IE10,IE11,Chrome,FF,Opera,Safari,Safari移动......它无处不在。我很好奇。
https://jsfiddle.net/bykwm1h3/2/
function scope(params) {
if (params) {
a = params;
} else {
console.log(a);
}
}
function evalInScope(code) {
eval.call(this, code)
}
// define variable - where is it defined?? definitely in the scope of the function as it is accessible there but, who really holds its instance?
evalInScope.call(scope, "var a;");
// setup variable values
scope([1,2,3]);
// print it out
evalInScope.call(scope, "console.log(a)");
// or print it out
scope();
答案 0 :(得分:4)
您的a
是一个全局变量,因为您正在执行间接eval
。当您执行间接eval
时,您传递的代码eval
将在全局范围内进行评估。全局范围内的var
创建全局变量。
进行间接评估的更规范的方法是使用变量:
var x = eval;
x("code here");
或使用逗号运算符:
(0, eval)("code here");
直接评估(eval("code here")
)评估您在eval
来电显示的范围内传递的代码。
是的:这种直接与间接eval
的业务令人困惑,令人惊讶,并且与其他职能的运作方式不一致。它没有被设计,它成长并被编纂。 : - )
如果你的目标是评估scope
函数中的代码,那不是代码的作用。为此,您需要在eval
中使用scope
:
function scope(code) {
eval(code);
}
您可以通过查看全局对象的属性来证明自己a
是全球性的,我们可以通过浏览器上的window
全局对象访问它:
function scope(params) {
if (params) {
a = params;
} else {
console.log(a);
}
}
function evalInScope(code) {
eval.call(this, code)
}
console.log("a in window?", "a" in window); // false
evalInScope.call(scope, "var a;");
console.log("a in window?", "a" in window); // true