0

“功能”在下面做什么?

$('.event-row').on('mouseover',function(){
  arc.event_handler.event_row_over();
  });

$('.event-row').on('mouseover',arc.event_handler.event_row_over );
4

7 回答 7

3

有一个非常重要的区别。

  • 第一个将调用函数,并将其值作为对象的上下文。thisevent_handler

  • 第二个将使用上下文调用函数,并将其this值作为处理程序绑定到的 DOM 元素。

所以第一个保留了预期的调用上下文 this值,这可能是函数需要的。

于 2012-11-01T02:33:05.763 回答
3

在第一种情况下,该函数this内部的匿名函数绑定到导致事件的 DOM 元素。这是浏览器中常见的约定,在本机绑定事件时也会这样做。然而,当调用arc.event_handler.event_row_over();时,this被重新绑定到arc.event_handlerinside event_row_over;因为它被称为对象方法,并且在这种情况下this指向调用该方法的对象。该方法将在没有任何参数的情况下被调用。

在第二种情况下,您arc.event_handler.event_row_over为事件注册函数。当调用 jQuery 时,设置this为相关元素,因此 inside event_row_overthis指向该元素。arc.event_handler除非有其他变量指向它,否则在那里不可用。jQuery 还将事件对象作为第一个参数传递,因此使用该参数调用方法。

通常对象方法期望this成为它们的对象,因此几乎在每种情况下,您都希望使用匿名函数来包装调用。如果元素很重要,请this作为参数传递给方法。

另一种方法,没有匿名函数,将使用bind()每个函数都有的方法:

$('.event-row').on('mouseover', arc.event_handler.event_row_over.bind(arc.event_handler));

但是,只有现代浏览器本机支持这一点。

于 2012-11-01T02:41:06.800 回答
1

在第一种情况下,您将函数调用包含在匿名函数中。

在第二种情况下,您只是分配函数指针..

于 2012-11-01T02:29:51.007 回答
1

首先,似乎那里有一个额外的点..arc.event_handler.event_row_over.();应该只是arc.event_handler.event_row_over();

匿名函数所做的只是调用一个以对象命名event_row_over的成员函数arc.event_handler;它不返回任何东西。

于 2012-11-01T02:30:41.820 回答
1

'function' 关键字将创建一个新的闭包并封装范围。关于闭包的好文章https://developer.mozilla.org/en-US/docs/JavaScript/Guide/Closures

于 2012-11-01T02:33:03.890 回答
1

函数的上下文/范围将不同。

此外,与第二个,

$('.event-row').on('mouseover',arc.event_handler.event_row_over );

您将事件对象作为参数。

于 2012-11-01T02:35:59.370 回答
1

第一种情况,你有一个额外的函数包装器。当您想在调用真正的事件处理程序“arc.event_handler.event_row_over()”之前执行其他操作时,这很有用,例如,您可以执行以下操作:

$('.event-row').on('mouseover',function(){
  doPreEventHandling();
  arc.event_handler.event_row_over();
  doPostEventHandling();
});

另一方面,您甚至可以将该匿名函数提取为命名函数并调用如下:

var eventHandler = function(){
      doPreEventHandling();
      arc.event_handler.event_row_over();
      doPostEventHandling();
};

$('.event-row').on('mouseover', eventHandler);

以上所有在行为上都是相似的,但是更多的包装函数你可以获得更多的抽象。但它会影响性能,有时还会影响可读性。

于 2012-11-01T02:36:45.773 回答