JavaScript 中出现意外的引用错误

an unexpected references error in javascript

本文关键字:引用 错误 意外 JavaScript      更新时间:2023-09-26

我正在尝试在JavaScript中创建一个由函数组成的数组。我编写了以下代码以确保数组中的每个函数都返回它的位置,但是数组中的每个函数都得到10,任何人都可以解释为什么吗?

function createFunctionArray(){
    var result = new Array();
    for(i=0;i<10;++i){
        result[i] = function(){
            var now = i;
            return now;
        };
    }
    return result
}

函数执行是延迟的,它返回对i的引用,而不是它的实际值。 您需要将i放在闭包中,以创建其值的本地副本。 喜欢这个:

result[i] = (function(i) { 
    return function(){
        var now = i;
        return now;
    } 
})(i);

小提琴

要查看其工作原理,您可以将上述函数提取到命名函数createFunction

var createFunction = function(i) {
    return function(){
        var now = i;
        return now;
    } 
}

像这样简单地使用它:

result[i] = createFunction(i);

小提琴

您的代码:

function createFunctionArray(){
    var result = new Array();
    for(i=0;i<10;++i){
        result[i] = function(){
            var now = i;
            return now;
        };
    }
    return result
}

调用此函数时。将 i 从 0 循环到 9,并将您创建的那些函数推送到数组中。但是,这些功能从未运行过。当循环在 i = 10 时结束时,您有一个您创建但从未调用的函数数组。所以现在..当您通过结果调用任何一个功能时[.. 说 4]。该函数将设置 var now = i,当前为 10,并返回该值。这是你总是得到 10 的方式。

你正在使用闭包。您应该始终记住的一件事是,闭包通过引用而不是值存储外部变量。因此,所有对i的引用都将更新为最终值i即 10。

正确执行此操作的一种可能方法是,

function createFunctionArray(){
var result = new Array();
for(i=0;i<10;++i){
    (function(j){
        result[j] = function(){
        return j;
        };
    })(i);    
}
return result;
}

小提琴链接