我有类似这样的代码:
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
因此,当我执行点击事件时,我希望动作[1]为“保存”,但它实际上是“禁用”。所以,就像它最后设定的那样,这就是我所得到的。
任何想法如何保持上下文?
非常感谢,
答案 0 :(得分: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);
}
});
}
});