2012-12-21 82 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));​