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

閉鎖が必要です。説明については、KingResigの説明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 に答える