【问题标题】:This Keyword in a Function Within an Object对象内函数中的 this 关键字
【发布时间】:2013-10-18 01:27:23
【问题描述】:

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

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?

【问题讨论】:

标签: javascript jquery


【解决方案1】:

最短的答案是试试这个:

$(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 应该在未来得到原生支持,没有库,但你还不能依赖旧版浏览器来支持它。

【讨论】:

  • fiddle.jshell.net/LxdAz - 在这个小提琴中你可以看到这两种不同类型的事件调用是如何工作的。请注意我如何获取事件$(e.currentTarget) 中的目标DOM 对象,这是jQuery 传递的this
猜你喜欢
  • 1970-01-01
  • 2011-12-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-05-05
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多