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

Javascript-函数/闭包变量范围-变量定义在哪里?,javascript,scope,Javascript,Scope,我正在研究worker远程方法调用和类实例化,并对闭包进行了一些评估研究。我带来了下面的代码,我真的很喜欢,我会用它,但我真的不明白它为什么工作,它是如何工作的。实际上,我不知道'a'变量存储在哪里,也不知道它的名称存储在哪里,因为我可以在函数内部或通过调用evals来访问它。另外,我想知道它的生命周期是什么,什么时候会被摧毁。这是对JS引擎的攻击还是有效的使用?我测试了IE10,IE11,Chrome,FF,Opera,Safari,Safari mobile。。。它无处不在。我很好奇 您的

我正在研究worker远程方法调用和类实例化,并对闭包进行了一些评估研究。我带来了下面的代码,我真的很喜欢,我会用它,但我真的不明白它为什么工作,它是如何工作的。实际上,我不知道'a'变量存储在哪里,也不知道它的名称存储在哪里,因为我可以在函数内部或通过调用evals来访问它。另外,我想知道它的生命周期是什么,什么时候会被摧毁。这是对JS引擎的攻击还是有效的使用?我测试了IE10,IE11,Chrome,FF,Opera,Safari,Safari mobile。。。它无处不在。我很好奇


您的
a
是一个全局变量,因为您正在执行一个间接
eval
。当您执行间接
eval
时,您传递的
eval
代码将在全局范围内进行评估<全局范围内的代码>变量创建全局变量

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

var x = eval;
x("code here");
或使用逗号运算符:

(0, eval)("code here");
直接eval(
eval(“code here”)
)在出现
eval
调用的范围内计算您传递给它的代码

是的:直接与间接的
eval
业务令人困惑、惊讶,并且与其他功能的工作方式不一致。它不是设计出来的,而是成长起来的,并被编成了法典。:-)

如果您的目标是评估
范围
函数中的代码,那么代码就不是这样做的。为此,您需要在
范围内使用
eval

function scope(code) {
    eval(code);
}

您可以通过查看
a
是否最终成为全局对象上的属性来证明它是一个全局对象,我们可以通过浏览器上的
窗口访问该全局对象:

功能范围(参数){
如果(参数){
a=参数;
}否则{
控制台日志(a);
}   
}
函数evalInScope(代码){
评估呼叫(此代码)
}
console.log(“窗口中的a?”,“窗口中的a”);//错误的
调用(作用域,“var a;”);

console.log(“窗口中的a?”,“窗口中的a”);//true
您的
a
是一个全局变量,因为您正在执行一个间接
eval
。当您执行间接
eval
时,您传递的
eval
代码将在全局范围内进行评估<全局范围内的代码>变量
创建全局变量

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

var x = eval;
x("code here");
或使用逗号运算符:

(0, eval)("code here");
直接eval(
eval(“code here”)
)在出现
eval
调用的范围内计算您传递给它的代码

是的:直接与间接的
eval
业务令人困惑、惊讶,并且与其他功能的工作方式不一致。它不是设计出来的,而是成长起来的,并被编成了法典。:-)

如果您的目标是评估
范围
函数中的代码,那么代码就不是这样做的。为此,您需要在
范围内使用
eval

function scope(code) {
    eval(code);
}

您可以通过查看
a
是否最终成为全局对象上的属性来证明它是一个全局对象,我们可以通过浏览器上的
窗口访问该全局对象:

功能范围(参数){
如果(参数){
a=参数;
}否则{
控制台日志(a);
}   
}
函数evalInScope(代码){
评估呼叫(此代码)
}
console.log(“窗口中的a?”,“窗口中的a”);//错误的
调用(作用域,“var a;”);

console.log(“窗口中的a?”,“窗口中的a”);//true
无论如何,没有必要使用
eval
来处理变量的作用域。我需要在将代码传递给worker并在那里实例化时动态生成代码。我需要保持作用域的有效性,即对于引用其他类的类属性。需要动态生成代码并不意味着需要
eval
来处理作用域。你可能想发布一个单独的问题,概述你想做什么,并询问如何在不使用
eval
的情况下完成。相信我,我已经花了4天的时间来考虑这个问题。我知道我在说什么;)这是一个沉重的X,Y问题——你发布了一个问题,但没有上下文,所以你得到的唯一答案是与你假设的答案相关的,没有人能给你更好的方法。没有任何必要,使用
eval
处理变量的作用域。我需要在将代码传递给worker并在那里实例化时动态生成代码。我需要保持作用域的有效性,即对于引用其他类的类属性。需要动态生成代码并不意味着需要
eval
来处理作用域。你可能想发布一个单独的问题,概述你想做什么,并询问如何在不使用
eval
的情况下完成。相信我,我已经花了4天的时间来考虑这个问题。我知道我在说什么;)这是一个沉重的X,Y问题——你发布了一个问题,但没有上下文,所以你得到的唯一答案是与你假设的答案相关的,没有人能给你更好的方法,事实并非如此。它无法在全球范围内访问。我保证了不,不是。它无法在全球范围内访问。我确定