2

可能重复:
循环内的 Javascript 闭包 - 简单的实际示例
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. 

    };

然后,从另一个文件中,我想实例化一个像 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 回答