“功能”在下面做什么?
$('.event-row').on('mouseover',function(){
arc.event_handler.event_row_over();
});
$('.event-row').on('mouseover',arc.event_handler.event_row_over );
“功能”在下面做什么?
$('.event-row').on('mouseover',function(){
arc.event_handler.event_row_over();
});
$('.event-row').on('mouseover',arc.event_handler.event_row_over );
有一个非常重要的区别。
第一个将调用函数,并将其值作为对象的上下文。this
event_handler
第二个将使用上下文调用函数,并将其this
值作为处理程序绑定到的 DOM 元素。
所以第一个保留了预期的调用上下文 this
值,这可能是函数需要的。
在第一种情况下,该函数this
内部的匿名函数绑定到导致事件的 DOM 元素。这是浏览器中常见的约定,在本机绑定事件时也会这样做。然而,当调用arc.event_handler.event_row_over();
时,this
被重新绑定到arc.event_handler
inside event_row_over
;因为它被称为对象方法,并且在这种情况下this
指向调用该方法的对象。该方法将在没有任何参数的情况下被调用。
在第二种情况下,您arc.event_handler.event_row_over
为事件注册函数。当调用 jQuery 时,设置this
为相关元素,因此 inside event_row_over
,this
指向该元素。arc.event_handler
除非有其他变量指向它,否则在那里不可用。jQuery 还将事件对象作为第一个参数传递,因此使用该参数调用方法。
通常对象方法期望this
成为它们的对象,因此几乎在每种情况下,您都希望使用匿名函数来包装调用。如果元素很重要,请this
作为参数传递给方法。
另一种方法,没有匿名函数,将使用bind()
每个函数都有的方法:
$('.event-row').on('mouseover', arc.event_handler.event_row_over.bind(arc.event_handler));
但是,只有现代浏览器本机支持这一点。
在第一种情况下,您将函数调用包含在匿名函数中。
在第二种情况下,您只是分配函数指针..
首先,似乎那里有一个额外的点..arc.event_handler.event_row_over.();
应该只是arc.event_handler.event_row_over();
匿名函数所做的只是调用一个以对象命名event_row_over
的成员函数arc.event_handler
;它不返回任何东西。
'function' 关键字将创建一个新的闭包并封装范围。关于闭包的好文章https://developer.mozilla.org/en-US/docs/JavaScript/Guide/Closures。
函数的上下文/范围将不同。
此外,与第二个,
$('.event-row').on('mouseover',arc.event_handler.event_row_over );
您将事件对象作为参数。
第一种情况,你有一个额外的函数包装器。当您想在调用真正的事件处理程序“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);
以上所有在行为上都是相似的,但是更多的包装函数你可以获得更多的抽象。但它会影响性能,有时还会影响可读性。