什么';这两个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:是的,但这通常不是调用对象方法时想要的。