javascript - 我无法理解闭包的示例
问题描述
请我理解关闭。为什么计数器在第一个变体中有效,但在第二个版本中没有?
var counter = (function(){
var count=0;
return function(){
return count++;
}
}());
console.log(counter());
console.log(counter());
console.log(counter());
计数器输出 0,1,2
var counter = function(){
var count=0;
return function(){
return count++;
}
};
console.log(counter()());
console.log(counter()());
console.log(counter()());
计数器输出 0,0,0
有什么区别?
解决方案
在第一个示例中,您使用的是Immediately Inovked Function Expression。这是调用内联函数并将结果函数分配给计数器。每次调用 counter() 时,您都在调用在范围内具有 count 变量的内部函数。
第二个例子相当于写成
function counter() {
var count=0;
return function(){
return count++;
}
}
以这种方式编写时,更清楚的是,每次调用 counter() 时,都会返回一个新函数,其中count
变量在范围内
在第二个示例中,您可以通过将结果分配给一个变量并多次调用该变量来执行等效操作。
var counter = function(){
var count=0;
return function(){
return count++;
}
};
var counterObj = counter();
counterObj(); // returns 0
counterObj(); // returns 1
counterObj(); // returns 2
推荐阅读
- android - Mainactivity.kt 无法识别 Android Studio kotlin 中的 ID
- javascript - 在 nuxt 配置上添加 axios 授权
- c# - '没有为“SelectedDate”找到属性、BindableProperty 或事件'和'在类型“DatePicker”中找不到属性“SelectedDate”'
- node.js - NodeJS - 嵌套的异步函数
- python - 偶数相加和求和的函数
- javascript - 由于元素是由 javascript 创建的,因此无法使用 eventListener 更改所需数量的元素的 css 属性
- javascript - 如何将 setInterval 设置为全局变量?
- c - 需要帮助创建一个返回您键入的字符串大小的函数
- python - 如何使用 Selenium 和 Python 点击启用 ember.js 的按钮
- javascript - 如何在令牌过期和/或刷新页面后使用 Firebase 在 Next.js 中保持身份验证