什么';这两个javascript调用之间的区别是什么?
“函数”在下列情况下起什么作用什么';这两个javascript调用之间的区别是什么?,javascript,jquery,Javascript,Jquery,“函数”在下列情况下起什么作用 $('.event-row').on('mouseover',function(){ arc.event_handler.event_row_over(); }); $('.event-row').on('mouseover',arc.event_handler.event_row_over ); 在第一种情况下,将函数调用封装在匿名函数中 在第二种情况下,您只是分配函数指针。首先,这里似乎有一个额外的点弧。事件处理程序。事件行。()应该是arc.ev
$('.event-row').on('mouseover',function(){
arc.event_handler.event_row_over();
});
$('.event-row').on('mouseover',arc.event_handler.event_row_over );
在第一种情况下,将函数调用封装在匿名函数中
在第二种情况下,您只是分配函数指针。首先,这里似乎有一个额外的点<代码>弧。事件处理程序。事件行。()代码>应该是
arc.event\u handler.event\u row\u over()代码>
匿名函数所做的就是调用arc.event\u handler
对象上名为event\u row\u的成员函数;“function”关键字将创建一个新的闭包并封装范围。关于闭包的好文章。有一个非常重要的区别
- 第一个函数将使用上下文调用函数,其
this
值作为事件处理程序
对象
- 第二个函数将使用其
this
值作为绑定处理程序的DOM元素的上下文调用函数
因此,第一个函数保留了函数可能需要的预期调用上下文值。函数的上下文/范围将不同
还有第二个,
$('.event-row').on('mouseover',arc.event_handler.event_row_over );
您将事件对象作为参数获取。第一种情况下,您有一个额外的函数包装器。在调用实际事件处理程序“arc.event\u handler.event\u row\u 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);
以上所有内容在行为上都很相似,但包装函数越多,获得的抽象就越多。但是它会影响性能,有时还会影响可读性。在第一种情况下,匿名函数将该函数中的绑定到导致事件的DOM元素。这是浏览器中常见的约定,在以本机方式绑定事件时也会这样做。调用arc.event\u handler.event\u row\u over()时但是,此
被重新绑定到弧。事件处理程序
内部事件行
;因为它被称为对象方法,在这种情况下,此
指向调用该方法的对象。将在没有任何参数的情况下调用该方法
在第二种情况下,为事件注册函数arc.event\u handler.event\u row\u over
。调用jQuery时,将此
设置为相关元素,因此在事件行
中,此
指向该元素<代码>弧。事件处理程序
在其中不可用,除非有其他变量指向它。jQuery还将事件对象作为第一个参数传递,因此使用该参数调用该方法
通常,对象方法期望这个成为它们的对象,因此在几乎所有情况下,您都希望使用匿名函数包装调用。如果元素很重要,请将此作为参数传递给方法
如果没有匿名函数,另一种方法是使用每个函数具有的方法:
$('.event-row').on('mouseover', arc.event_handler.event_row_over.bind(arc.event_handler));
但是,只有现代浏览器在本机上支持此功能。ok-匿名功能给了我什么?抱歉问了个愚蠢的问题。匿名函数只是一个没有名字的函数。。在这种情况下,这是用来为变量提供作用域的。好吧,有没有办法解释它在非全职javascript开发人员中实现了什么。对不起,每一个解释似乎都很冗长。检查这篇文章。。比我解释“在这种情况下,这是用来为变量提供作用域的”——你说的是哪一个变量?好的,这更有意义,因为这是我们在实验中看到的。@timpone:是的,人们经常会在这个问题上绊倒。他们期望函数将保持其与对象的关系,而事实上,一旦您将其与对象分离,它就不记得它来自何处。另一个区别是,第一种方法在事件发生时调用任何函数arc.event\u handler.event\u row\u over
引用,而第二种方法将调用在执行.on()
语句时引用的arc.event\u handler.event\u row\u上的任何函数-不一定是同一个函数。另请注意,第二个函数允许arc.event\u handler.event\u row\u over()
将值返回给jQuery(对于鼠标悬停处理程序来说,这并不意味着什么,但在单击处理程序中,返回值可能会取消默认行为)。@nnnnnnnn:Hmmm。。。不确定在执行on()
时调用它是什么意思。在我看来,函数正在被传递,而不是被调用。我误解你的评论了吗?编辑:哦,我明白你的意思了。该函数可以在以后但在事件发生之前被替换。很好。您所指的“上下文”是函数的this
值,而this
不是上下文。ECMAScript中的术语“上下文”有多种用途,主要用于执行上下文。永远不要引用函数的this
值。是的,例如,“event_row_over”可以定义为:function event_row_over(e){do_something_with_e;}
thx,ThiefMaster,那么在第一种情况下,向end添加.call(this)会导致它绑定到.event row吗?我真的很感激你的回答+1。欢迎有人解释这个
而没有错误地引用.Thx,RobG-但是你能给我一句话来充实你的评论吗。不确定我是否完全理解。我想我是从其他人那里理解的comment@timpone:是的,但这通常不是调用对象方法时想要的。