首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >For循环初始化器捕获

For循环初始化器捕获
EN

Stack Overflow用户
提问于 2020-04-22 01:21:52
回答 1查看 22关注 0票数 0

我对for循环中声明的函数的关闭行为非常困惑,特别是对初始化程序中定义的变量:

代码语言:javascript
复制
function createFunctions(){
    const functions = []
    for(let i = 0; i < 5; i++)
        functions.push(() => i);
    return functions;
}
const results = createFunctions().map(m => m())
// results: [0, 1, 2, 3, 4]

vs

代码语言:javascript
复制
function createFunctions(){
    const functions = []
    let i;
    for(i = 0; i < 5; i++)
        functions.push(() => i);
    return functions;
}
const results = createFunctions().map(m => m())
// results: [5, 5, 5, 5, 5]

因为在for循环中声明的匿名箭头函数捕获了它的作用域,所以我认为这两种情况都会产生[5, 5, 5, 5, 5],因为在调用时,i的值是5。然而,第一个结果似乎表明,在每次循环迭代时,i都是一个不同的变量。但是,如果重复测试,但初始化的变量是对象而不是数字:

代码语言:javascript
复制
function createFunctions(){
    const functions = []
    for(let obj = {}, i = 0; i < 5; i++)
        functions.push(() => obj);
    return functions;
}
const results = createFunctions().map(m => m())
// results: [{}, {}, {}, {}, {}]; results[0] === results[1]: true

我们可以看到,返回的数组中的所有元素在引用上都是相等的,因此变量也不是不同的。因此,函数关闭在for循环初始化器中声明的变量的方式似乎会根据变量是否是原语而改变,这在我看来很荒谬。

我遗漏了什么?

EN

回答 1

Stack Overflow用户

发布于 2020-04-22 01:21:52

所以,我费了很大劲才写出这个问题,在研究的过程中,我偶然找到了答案,所以我想我应该把这个问题转换成一个自我回答的问题,这样如果其他人遇到同样的行为,可能会更容易找到。

我找到了答案here

在循环中,如果让-声明一个变量,那么每次迭代都会得到一个新的绑定。允许您这样做的循环有:forfor-infor-of

这就解释了为什么两个对象是相等的:我们得到一个新的变量,这个变量在循环结束时赋给前一个变量的值。在对象的情况下,新变量指向相同的对象,这解释了引用相等。它还解释了为什么第一种情况会产生[0, 1, 2, 3, 4]:与对象不同,数字是值,而不是引用。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/61349374

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档