1

这是一个基础问题,但我无法弄清楚为什么上下文(“this”指针)在第二个事件处理程序中是正确的,而在第一个事件处理程序中是不正确的。

我有这个简单的构造函数来创建对象 myNotifier:

function Notifier ( message ) {
  this.message = message;
  this.saySomething = function () {
    alert( "I say:" + this.message);
  }
}

myNotifier = new Notifier(" HELLO!");  

然后我将该myNotifier.saySomething()方法用作 CLICK 两个按钮的事件处理程序:

$(".button1").click( myNotifier.saySomething );
$(".button2").click( function () { myNotifier.saySomething()});

第一个显示:“我说:未定义” 第二个显示:“我说:HELLO”

我知道调用方法时上下文(this)不是原始对象,但是为什么在第二个按钮的函数内部调用时它是正确的?

一个要测试的 jsfiddle

4

2 回答 2

3

查看MDN 对this关键字的参考:是的,上下文取决于您调用方法的方式。

如果您将函数作为对象的属性调用(例如在 button2 的处理程序中),则该对象将用作上下文。

但是,如果将它用作事件处理程序(如果用 jQuery 包装,则相同),调用函数的上下文是当前 DOM 元素,侦听器绑定到该元素。并且按钮没有属性“消息”,所以它会提醒undefined

当然,这些不是唯一的选择。你可以试试

var fn = myNotifier.saySomething;
fn(); // context is the global object (window)

或者

myNotifier.saySomething.call({message:"buh!"});

:-) - 参见 MDN 以获得更多解释。

于 2012-09-22T17:41:03.313 回答
1

for关键字是带有 class$(".button1").clickthisDom 元素button1

for关键字是指您包装调用的匿名$(".button2")函数thismyNotifier.saySomething()

您可以使用apply()原型函数来更改函数的上下文。

于 2012-09-22T17:41:28.377 回答