所以我将大部分函数和变量组织成基于对象的小模块,如下所示:
module1: {
someVariable: false,
someFunction: function(e) {
do some stuff using someVariable
},
someFunction2: function(e) {
do some other stuff
}
}
我在各种事件中将这些函数称为回调,如下所示:
$(function() {
$('.thing').on('mouseenter', module1.someFunction);
}
现在,从someFunction中,我希望'this'关键字引用包含该函数的对象。相反,它指的是触发触发函数的事件的DOM元素。无论如何我可以访问,比如函数的包含对象中的someVariable变量,而不是编写module1.someVariable?
答案 0 :(得分:4)
最简单的答案是试试这个:
$(function() {
$('.thing').on('mouseenter', function(e) {
module1.someFunction(e);
});
}
如果直接在对象上调用方法,则'this'值仅设置为方法所附加的对象:
module1.someFunction(); // direct invocation, 'this' will be set properly
var tempFunc = module1.someFunction;
tempFunc(); // the function was removed first. 'this' will NOT be set
在您的情况下,您正在从对象中删除该方法并将其交给事件处理程序。事件处理程序不知道该对象,也不执行直接调用。
事实上,事件处理程序显式会覆盖上下文,因为这就是jQuery API的定义方式。如果你想要你正在谈论的行为,你必须明确地重写它。
使用像underscore.js这样的库,你也可以bind将函数传递给事件处理程序。
$(function() {
$('.thing').on('mouseenter', _.bind(module1.someFunction, module1));
}
我相信Object.bind将来会被原生支持,没有库,但你还不能依赖旧的浏览器来支持它。