【发布时间】:2018-08-12 07:33:09
【问题描述】:
免责声明:这个问题纯粹是出于好奇,并且与 javascript 的工作原理有很大关系。
我了解以下代码为何有效。由于闭包, foo 可以访问 a 所在的范围。这是有道理的。
var a = 10
var foo = function(){
console.log(a);
}
setTimeout(foo,1000)
但是,我想知道为什么以下内容也有效(稍后解释)。
var a = 10
setTimeout(function(){
console.log(a);
},1000)
函数在接收它的函数的参数中定义,本质上从来不是包含a 的范围的闭包。我们知道,当一个函数接收一个参数时,它会为该参数创建一个局部变量,例如
var outerVar="5"
var bar = function(a){
//implicitly, var a = outerVar happens here
console.log(a)
}
bar(something);
所以按照这个逻辑,传递给setTimeout 的函数无法访问a,但它确实可以。
我怀疑当一个函数在参数空间中定义时会发生什么,它实际上是在被分配为参数之前定义的,但没有证据证明这一点。任何指针都非常感谢。
非常感谢。
【问题讨论】:
-
您的问题在于“函数是在接收它的函数的参数中定义的,本质上从来不是包含 a 的范围的闭包。”这不是真的。函数的定义是在“a”上发生闭包的地方。这与“a”在同一范围内。
-
@bhspencer 是的,但是定义到底发生在哪里?我改写了这个问题以显示我的意思。看看这个:stackoverflow.com/questions/49106298/…
标签: javascript closures