为啥存储函数总是引用更新后的全局 i 变量的值?

Posted

技术标签:

【中文标题】为啥存储函数总是引用更新后的全局 i 变量的值?【英文标题】:Why stored function will always refer to the value of the updated global i variable?为什么存储函数总是引用更新后的全局 i 变量的值? 【发布时间】:2021-09-05 07:49:56 【问题描述】:
var printNumTwo;
for (var i = 0; i < 3; i++) 
  if (i === 2) 
    printNumTwo = function() 
      return i;
    ;
  

console.log(printNumTwo());

为什么 i 的打印值是 3 而不是 2?

【问题讨论】:

【参考方案1】:

由于var 关键字,当您使用var 关键字进行循环时,它会替换值而不是创建新值,其中i 创建一次并在每次迭代时被i 替换...您应该使用letconst 来期待你想要的输出。

示例:

使用let关键字

for (let i = 0; i < 3; i++) 
    setTimeout(() => console.log(i), i * 100)

这里我们使用了var关键字

for (var i = 0; i < 3; i++) 
    setTimeout(() => console.log(i), i * 100)

换句话说,在 javascript 中使用 var 关键字来声明一个变量,在函数或闭包范围内创建一个变量,而不是在块范围内。

【讨论】:

以上是关于为啥存储函数总是引用更新后的全局 i 变量的值?的主要内容,如果未能解决你的问题,请参考以下文章

局部变量 全局变量和存储属性

在函数中修改全局变量的值,需要加global关键字

对内存空间的理解

装饰器

为啥全局对象属性在函数后不更新?

c语言工程里其它文件引用全局变量?