我一直在阅读“你不懂 JS”系列丛书,我有一个关于闭包的问题。
var a;
function wait() {
a = 10;
return setTimeout(function timer() {
console.log('Hello closure ', a);
}, 1000)
}
const fn = wait;
fn();
console.log(a);
如果我在控制台中询问a的值而不执行函数(fn()),它会说它是未定义,这是正确的。
现在,如果我在 1 秒后执行函数 fn() ,它将打印 Hello Closure 10 我知道计时器有一个等待函数的闭包,这就是它打印的原因该值,即使它是在定义它的词法范围之外执行的。
但是如果现在在控制台中打印 a 值(运行 fn() 后),它也会输出 10 ,所以我猜是这样不是词法范围,从全局范围来看,查找永远不会向下(我的意思是它在嵌套函数中深入查找),它总是向上查找变量(向上到函数的封闭范围) .
所以我想知道这是否也是闭包,或者变量在运行函数后得到了另一个值,仅此而已?
最佳答案
如果在函数内部实例化该变量,则会阻止同名的全局变量发生更改。我在函数中添加了 var a = 10
。我将全局作用域的 var 留在那里,这样你就可以看到它现在没有改变。这更多的是一个变量范围问题。
闭包按照您的预期工作,只是您设置了一个全局变量。
var a;
function wait() {
var a = 10;
return setTimeout(function timer() {
console.log('Hello closure ', a);
}, 1000)
}
const fn = wait;
fn();
console.log(a);
关于javascript - 了解 JavaScript 中的闭包范围,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55423108/