什么'这个javascript闭包的区别是什么

What's the difference in this javascript closure?

本文关键字:闭包 区别 是什么 javascript 这个 什么      更新时间:2023-09-26

之间(在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?

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

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

它将永远保持2。

这是因为在第一个功能中,你的关闭

  1. num变量没有保留。

  2. 不会导致数量增加。

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

如果您调用numberGenerator,同样如此,因为num值将被重新声明/重置为1,然后在其下一次声明时增加并自分配值2。

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

示例1用var num = 1;初始化,然后用num++;增加。调用第一个函数的频率并不重要,因为num的值再也不会改变,它永远是2。在示例1中调用number()时,仅执行console.log(num);

在示例2中,每次调用函数时都会执行num++;。因此,它将随着每次呼叫而增加。

在函数调用(var number=numberGenerator)时,闭包'checkNumber()'可以访问局部变量'num',并且即使在该值随num++递增后仍保留该值。闭包可以直接访问局部变量"num",每次使用变量"number"访问时都会对其进行更改。只有当num++在闭包内部时,这才有效,因为闭包可以直接访问它所包含的函数中的局部变量。Douglas Cochford的书《JavaScript:好的部分》在创建和理解闭包方面帮了我很多忙
我希望这能有所帮助!