4

可能重复:
循环内的 Javascript 闭包 - 简单的实际示例

我正在尝试使用自调用函数,以便每个函数objects都返回不同的消息。

<script type="text/javascript">

    objects = {};

    for( var i = 0; i < 10; i++ ) {

        objects['function'+i] = function () {

            var text = ( function() { return "I am object " + i; } )();

            return text;

        };

    }

    for( var j = 0; j < 10; j++ ) {

        document.write( objects['function'+j]() + "<br>" );

    }

</script>

到目前为止,上述结果:

我是对象 10

我是对象 10

我是对象 10

我是对象 10

我是对象 10

我是对象 10

我是对象 10

我是对象 10

我是对象 10

我是对象 10

我怎样才能使用自我调用功能来立即设置消息,而不是与不稳定的联系在一起i

4

4 回答 4

8

您需要传入迭代器变量,以便您的匿名函数可以将其存储在它自己的激活对象/词法环境记录中(= 在它自己的上下文对象中)。

此外,您需要这个匿名函数来包装所有访问点:

objects[ 'function' + i ] = function( i ) {

    var text = function() { return "I am object " + i; };

    return text;

}( i );
于 2012-12-19T23:24:26.217 回答
1

您需要构建一个闭包关闭该特定i变量并返回未绑定的函数i

for (var i = 0; i < 10; i++) {
    objects['function'+i] = ( function (num) {
        return function() {
            var text = "I am object " + num;
            return text;
        };
    } )( i ); // <== put the variable into the self-invoking function
}
于 2012-12-19T23:30:15.910 回答
0

你需要一个关闭.. 在这里查看 King Resig 的解释http://ejohn.org/apps/learn/#59以获得解释。但是要使此代码正常工作,您必须确保在调用函数时保持 i 的值......所以它就像

http://jsbin.com/uveluw/1/edit

for( var i = 0; i < 10; i++ ) (function(i){

    objects['function'+i] = function () {
        var text = ( function() { return "I am object " + i; } )();
        return text;
    };

})(i)
于 2012-12-19T23:30:41.470 回答
0

立即执行返回值,以便 i 关闭循环:

objects = {};
for( var i = 0; i < 10; i++ ) {
    objects['function'+i] = (function () {
        var text = ( function() { return "I am object " + i; } )();
        return text;
    })();
}

for( var j = 0; j < 10; j++ ) {
    console.log( objects['function'+j] );
}
于 2012-12-19T23:36:44.103 回答