什么'这个javascript闭包的区别是什么
What's the difference in this javascript closure?
之间(在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。
这是因为在第一个功能中,你的关闭
-
对num变量没有保留。
-
不会导致数量增加。
-
每次调用都将返回主机函数(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:好的部分》在创建和理解闭包方面帮了我很多忙
我希望这能有所帮助!
- 在underscorejs模板中使用闭包
- setTimeout可以与闭包内的函数一起使用吗
- 附加到原型属性的Do函数没有闭包
- 使用闭包共享构造函数参数
- 使用Google闭包编译器包含一个Ecmascript 6类
- 从js引擎的角度来看闭包和构造函数是如何工作的
- for循环中的JavaScript闭包
- Javascript闭包-如何防止内存泄漏
- JavaScript中带有构造函数的对象和闭包之间的区别
- 内部括号与外部括号的闭包之间的区别
- Javascript - 闭包和正常函数之间的区别
- Javascript - 命名空间与闭包之间的区别
- 闭包可以使用new关键字和区别,例如,在创建新对象/类时
- 在谷歌'的闭包编译器,{Element}和{HTMLElement}之间有什么区别
- 这两个使用父类的函数闭包有什么区别吗?
- 这两种javascript闭包语法之间的区别
- Javascript闭包:直接访问模型和使用变量的区别
- JavaScript中循环中的闭包的区别
- 闭包编译器返回void和返回undefined之间的区别
- 两种使用闭包的方法之间的区别