javascript中的误解性闭包

时间:2019-03-29 17:56:13

标签: javascript closures theory

我一直在阅读您不知道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()),则表示它是 undefined 是正确的。

现在,如果我在1秒后执行 fn()函数,它将打印 Hello Closure 10 。我知道计时器具有关闭等待功能的功能,这就是为什么它可以打印该值,即使在定义它的词法范围之外执行时也是如此。

但是如果现在在控制台中(运行fn()之后)在控制台中打印 a 值,它也会输出 10 ,所以我猜这不是词法作用域,在全局作用域中查找永远不会失败(我的意思是它在嵌套函数中看起来很深),它总是在向上寻找变量(直到函数的封闭范围)

所以我想知道这是否也是闭包,或者变量在运行函数后刚刚获得了另一个值?

我希望这不是一个愚蠢的问题,谢谢!

1 个答案:

答案 0 :(得分:1)

如果在函数内部实例化变量,它将防止相同名称的全局变量更改。我在函数中添加了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);