使用自调用函数是变量独立的

时间:2012-12-19 23:21:28

标签: javascript self-invoking-function self-executing-function

  

可能重复:
  Javascript closure inside loops - simple practical example

我正在尝试使用自调用函数,以便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 个答案:

答案 0 :(得分:8)

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

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

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

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

    return text;

}( i );

答案 1 :(得分:1)

您需要针对该特定i变量构建closure结束,并返回从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
}

答案 2 :(得分: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)

答案 3 :(得分: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] );
}