繁体   English   中英

Javascript-函数/闭包变量范围-变量在哪里定义?

[英]Javascript - function / closure variable scope - where is the variable defined?

我正在研究我的工作者远程方法调用和类实例化,并且我正在做一些关于闭包的评估研究。 我附带了我非常喜欢的波纹管,我将使用它,但并不太了解为什么它起作用以及如何起作用。 实际上,我不了解“ a”变量的存储位置以及其名称的存储位置,因为我可以在函数内部或通过调用eval来访问它。 另外,我想知道它的生命周期是什么,什么时候会被破坏。 是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();

您的a是全局变量,因为您正在执行间接eval 进行间接eval ,在全局范围内评估通过eval的代码。 全局范围内的var创建全局变量。

进行间接评估的更规范的方法是使用变量:

var x = eval;
x("code here");

或使用逗号运算符:

(0, eval)("code here");

直接 eval( eval("code here") )在eval调用出现的范围内评估您传递的代码。

是的:直接eval与间接eval做法令人困惑,令人惊讶,并且与其他功能的工作方式不一致。 它不是经过设计的,它已经成长并被编纂。 :-)

如果您的目标是评估scope函数中的代码,那不是该代码的作用。 为此,您可以在scope使用eval

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 

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM