对象内函数中的关键字

时间:2013-10-17 17:16:20

标签: javascript jquery

所以我将大部分函数和变量组织成基于对象的小模块,如下所示:

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?

1 个答案:

答案 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将来会被原生支持,没有库,但你还不能依赖旧的浏览器来支持它。