2012-12-21 120 views
2

可能重複:
Javascript closure inside loops - simple practical example
Javascript infamous Loop problem?JavaScript對象的自定義功能

我有一個基礎的功能,我想控制什麼最終成爲像 「bumpbox」。我的目標是實例化多個實例併爲每個聲明的變量賦予一個自定義配置。

物體看起來是這樣的:

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. 

    }; 

,然後從另一個文件,我要像實例化新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')) 
     }; 

,然後我通過每個那些想要循環並在每個這樣的設置自定義測試()函數:

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

     alert(i); 
    } 

但是當我運行這段代碼,就會切換所有的元素到最後一個我稱爲的值,在這種情況下是「服務」,而不是給每一個獨特的元素。

回答

4

你似乎需要爲你的迴路closure

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); 
} 
+0

這個偉大的工作。謝謝。 – JonMorehouse

1

爲了讓每個test()有自己獨特的i,嘗試:

bumpbox_controllers[i]['test'] = (function (i) { 
    return function() { 
     alert(i); 
    }; 
}(i));​