Javascript 为什么循环中定义的函数都返回相同的值?

Javascript 为什么循环中定义的函数都返回相同的值?,javascript,Javascript,我被下面的JavaScript代码弄糊涂了。我编写了一个循环并在循环中定义了一个函数,但是当我调用在循环中定义的函数时,我只得到10而不是索引 显然,在下面的代码中,我提取了一些不相关的东西: objectArray = []; for (i = 0; i< 10; i++){ objectArray[i] = {}; } for (i = 0; i< 10; i++){ objectArray[i].get_number = function(){

我被下面的JavaScript代码弄糊涂了。我编写了一个循环并在循环中定义了一个函数,但是当我调用在循环中定义的函数时,我只得到10而不是索引

显然,在下面的代码中,我提取了一些不相关的东西:

objectArray = [];
for (i = 0; i< 10; i++){
    objectArray[i] = {};   
}
for (i = 0; i< 10; i++){
    objectArray[i].get_number = function(){
        return i;    
    }
}
console.log(objectArray[5].get_number()); // returns 10 rather than 5
objectArray=[];
对于(i=0;i<10;i++){
objectArray[i]={};
}
对于(i=0;i<10;i++){
objectArray[i]。get_number=函数(){
返回i;
}
}
console.log(objectArray[5].get_number());//返回10而不是5

我总是得到10分,比我预期的要多

这是因为JavaScript关闭。方法
objectArray[i].get_number
可以直接访问
i
(不是
i
的副本)。
i
的值保留在内存中,因为每个方法
objectArray[i]。get_number
仍然可以访问它。只有一个
i
,当循环迭代它时,它会增加一个。当一个方法
objectArray[i].get_number
访问它时,循环已经运行到完成,因此它访问
i

这是什么
objectArray[i]={}应该做什么?@odedta它将每个元素初始化为一个空对象我几乎肯定这是一个重复,但现在找不到一个合适的目标这是一个臭名昭著的循环内的
闭包问题。使用闭包可以访问外部作用域,因此可以访问
i
。但是(这是最重要的部分):在循环已经完成的时间点访问
i
!解决方案:使用单独的作用域(例如,通过在循环时创建i的本地副本),然后在闭包函数中使用本地副本。使用反勾号。我不知道你在说什么。此外,你可能还想为问题添加解决方案。如何避免这种情况?@rudepeoplesteoff您可以使用`字符使代码看起来更像代码。这是objectArray[i]之间的区别。get_number和
objectArray[i]。get_number
-产生了所有的区别。