2

重複の可能性:
ループ内のJavascriptクロージャ-単純な実用例
Javascriptの悪名高いループの問題?

「バンプボックス」のようになるものを制御したいという基本機能があります。私の目標は、これの複数のインスタンスをインスタンス化し、宣言された各変数にカスタム構成を与えることです。

オブジェクトは次のようになります。

Project.Modules.bumpbox = function(in_trigger, container) {

    var config = {

        'speed': 500,
        'easing' : false,//will 
        'in_callback': false,
        'out_callback' : false,
        'visible': false,
        'out_trigger' : $('#bumpbox_out_trigger'),//this is set by default only change if you know what you are doing!
    };

    this.test = function() {

        //this should be the default function. 

    };

次に、別のファイルから、new Project.Modules.Bumpbox()のようなインスタンスをインスタンス化し、テスト関数を上書きします。

var bumpbox_controllers = {

            "map" : new Project.Modules.bumpbox($('#navigation_top li.map'), $('.bumpbox.map')),
            "contact" : new Project.Modules.bumpbox($('#navigation_top li.contact'), $('.bumpbox.contact')),
            "about" : new Project.Modules.bumpbox($('#navigation_left li.about'), $('.bumpbox.about')),
            "team" : new Project.Modules.bumpbox($('#navigation_left li.team'), $('.bumpbox.team')),
            "careers" : new Project.Modules.bumpbox($('#navigation_left li.careers'), $('.bumpbox.careers')),
            "services" : new Project.Modules.bumpbox($('#navigation_left li.services'), $('.bumpbox.services'))
        };

次に、それらのそれぞれをループして、次のようにそれぞれにカスタムtest()関数を設定します。

    bumpbox_controllers[i]['test'] = function() {

        alert(i);
    }

しかし、このコードを実行すると、すべての要素が最後に呼び出されたi値(この場合は「サービス」)に切り替わり、それぞれに一意の要素は与えられません。

4

2 に答える 2

4

ループにはクロージャーが必要なようです:

for (var controller in bumpbox_controllers) {
    bumpbox_controllers[controller] = (function(i) {
        // creating a new context for i
        return function() {
            alert(i); // access the i in scope, not the controller
        }
    })(controller);
}
于 2012-12-21T00:42:18.427 に答える
1

それぞれtest()が独自の一意の を持つようにするにはi、次を試してください。

bumpbox_controllers[i]['test'] = (function (i) {
    return function () {
        alert(i);
    };
}(i));​
于 2012-12-21T00:41:20.707 に答える