这个javascript封闭有什么区别?

时间:2016-05-08 21:20:47

标签: javascript closures

之间的区别(num++):

function numberGenerator() {
  // Local “free” variable that ends up within the closure
  var num = 1;
  function checkNumber() { 
    console.log(num);
  }
  num++;
  return checkNumber;
}

var number = numberGenerator();
number(); // 2
number(); // 2
number(); // 2

function numberGenerator() {
  // Local “free” variable that ends up within the closure
  var num = 1;
  function checkNumber() { 
    console.log(num);
    num++;
  }
  return checkNumber;
}

var number = numberGenerator();
number(); // 1
number(); // 2
number(); // 3

为什么第一个代码不记得num的值?

为什么它是2而不是1?

4 个答案:

答案 0 :(得分:3)

因为当您在第一个示例中运行number()时,num++不会再次执行,因为它不在该函数中。

答案 1 :(得分:1)

示例1使用var num = 1;进行初始化,然后使用num++;进行初始化。您调用第一个函数的频率并不重要,因为num的值永远不会再次更改,它始终为2.只有console.log(num);在您调用number()时才会执行例1。

在示例2中,每次调用函数时都会执行num++;。因此,每次通话都会增加。

答案 2 :(得分:1)

事实上,它确实记得很清楚。 num 的变量名值始终为2,无论你多久坚持调用它;即:执行变量名的返回闭包。

它将永远保持2。

那是因为在第一个函数中你的闭包

  1. 没有保留 num 变量。

  2. 不会导致 num 增加。

  3. 每次调用都会返回主机函数(num ++)增加的结果,这只发生过一次。它的价值已经是2。

  4. 如果你再次调用 numberGenerator ,那就完全相同了,因为 num 值将被重新声明/重置为1而不是增加并且自我赋值为2下一个宣言。

    所以,没有区别,只是你的第一个闭包,不能增加 num 变量值,因为它没有意思去做。

答案 3 :(得分:1)

在函数调用时(var number = numberGenerator),闭包' checkNumber()'可以访问本地变量' num',即使在用num ++递增后也保持该值。闭包可以直接访问本地变量'并在每次使用变量'来访问时更改它。这只适用于num ++在闭包内部,因为闭包可以直接访问它所包含的函数中的局部变量.Douglas Cockford的书" JavaScript:好的部分"在创建和理解闭包方面给了我很多帮助 我希望这有帮助!