Javascript - 函数/闭包变量作用域 - 定义的变量在哪里?

时间:2017-05-11 17:31:25

标签: javascript scope

我正在进行我的工作者远程方法调用和类实例化,我正在使用闭包进行一些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();

1 个答案:

答案 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