0

我有这样的代码:

        for (var i = 0; i < interactions.length; i++) {
            action = interactions[i].split(':');

            if (events.indexOf(action[0]) >= 0) {
                $(this).bind(action[0], function (e) {
                    if (action.length == 2) {
                        model[action[1]]();
                    }
                    else if (action.length == 3) {
                        var args = action[2].split('|');
                        model[action[1]].apply(null, args);
                    }
                });
            }
        }

变量“events”只是一个带有事件名称的字符串,如“click,dblclick”等......问题是当我进入事件时,“action”变量正在失去上下文。这似乎是一个类似于闭包的构造,其中“动作”应该保留在上下文中,但事实并非如此。在此示例中,我有两个交互,如下所示:

1)点击:保存

2)禁用:SomeCustomFunction

所以,当我执行一个点击事件时,我希望 action[1] 是“保存”,但它实际上是“禁用”的。所以,就像上次设置的一样,这就是我得到的。

任何想法如何保持上下文?

非常感谢,

4

1 回答 1

0

到事件处理程序运行时(单击或实际发生的任何事情)action将等于for循环的最后一次迭代中的任何事情。如果action是在每次迭代时调用的函数中的局部变量,那么您将获得所需的闭包构造。

由于您已经在使用 jQuery,因此最简单的更改是使用$.each()而不是普通for循环,因此将每次迭代的处理放入其自己的闭包中action

   $.each(interactions, function(i, item) {
        var action = item.split(':');

        if (events.indexOf(action[0]) >= 0) {
            $(this).bind(action[0], function (e) {
                if (action.length == 2) {
                    model[action[1]]();
                }
                else if (action.length == 3) {
                    var args = action[2].split('|');
                    model[action[1]].apply(null, args);
                }
            });
        }
    });
于 2012-07-08T05:22:46.743 回答