javascript - 试图理解 javascript 闭包的问题
问题描述
我一直在尝试理解 JavaScript 中的闭包是如何工作的,但是我在理解它的某些部分时遇到了一些问题。
让我们看看这个例子:
const Component = () => {
let counter = 0;
const logger = () => {
console.log(counter);
}
setTimeout(() => counter = counter + 10, 1000);
return logger;
}
const myLogger = Component();
myLogger(); // output after ~1s: 10
当创建“闭包”时,logger
函数引用的变量(不是函数的一部分,在这种情况下counter
为:),存储在函数的隐藏[[Scope]]
属性中,以便函数在执行时可以引用它们。
我认为该[[Scope]]
属性具有函数引用的初始值的副本,因为它是一个词法范围。但是在执行我的代码之后,我意识到counter
在函数创建之后的值会发生变化。我认为counter
应该0
在调用之后的值myLogger()
,因为它是存储在函数作用域中的初始值,只能在函数内部进行更改。
该操作setTimeout
不应增加. 或者至少我是这么认为的。counter
logger
我做错了什么还是我错过了其他东西?
解决方案
推荐阅读
- c# - 使用asp.net核心身份DefaultUI时如何在成功注册时运行代码?
- javascript - 无服务器(aws-node):从不同的文件调用函数返回内部服务器错误
- javascript - 绑定到对象的 Vue.js 类在对象更新时没有改变
- python - 如何从转储(序列化为字符串)JSON对象中解析/调用关键字?
- javascript - 如何将默认下拉菜单从 php 更改为 jquery?
- python - 多处理:池和映射以及 sys.exit()
- python - 获取Django app中上传文件的文件大小
- algorithm - n 楼梯/阶梯攀登问题:无法概念化为什么 T(n) = T(n-1) + T(n-2)
- angular - 服务工作者不在 Angular 8 中工作
- c# - 通过将“[Serializable]”属性添加到 C# 类,消息大小可以增加多少?