Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/google-chrome/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript JQuery:传递回调方法(带或不带大括号),给出不同的结果_Javascript_Jquery_Jquery Callback - Fatal编程技术网

Javascript JQuery:传递回调方法(带或不带大括号),给出不同的结果

Javascript JQuery:传递回调方法(带或不带大括号),给出不同的结果,javascript,jquery,jquery-callback,Javascript,Jquery,Jquery Callback,我有来自JQuery示例的代码块。我只在hide方法调用上添加了一个回调 第一例 <!DOCTYPE html> <html> <head> <script src="jquery.js"></script> <script> function sayHello(){ alert('hello sit'); } $(document).ready(function(){ $("button").click(funct

我有来自JQuery示例的代码块。我只在hide方法调用上添加了一个回调

第一例

 <!DOCTYPE html> <html> <head> <script src="jquery.js"></script> <script> function sayHello(){ alert('hello sit'); }

$(document).ready(function(){   $("button").click(function(){
    $("p").hide(100,sayHello);   }); });

</script> </head> <body> <button>Hide</button> <p>This is a paragraph with little content.</p> <p>This is another small paragraph.</p> </body> </html>
函数sayHello(){alert('hello-sit');}
$(文档).ready(函数(){$(“按钮”)。单击(函数()){
$(“p”).hide(100,sayHello);});
隐藏这是一个内容很少的段落。

这是另一个小段落。

第二个案例是

 <!DOCTYPE html> <html> <head> <script src="jquery.js"></script> <script> function sayHello(){ alert('hello sit'); }

$(document).ready(function(){   $("button").click(function(){
    $("p").hide(100,sayHello());   }); });

</script> </head> <body> <button>Hide</button> <p>This is a paragraph with little content.</p> <p>This is another small paragraph.</p> </body> </html>
函数sayHello(){alert('hello-sit');}
$(文档).ready(函数(){$(“按钮”)。单击(函数()){
$(“p”).hide(100,sayHello();});
隐藏这是一个内容很少的段落。

这是另一个小段落。

两者之间唯一的区别是传递带大括号或不带大括号的回调函数

在第一种情况下,单击隐藏按钮,我会收到两次hello警报。 在第二种情况下,我只收到一次hello警报。 我希望在这两种情况下,警报只会出现一次,因为无论是否使用大括号调用zero args函数都无关紧要


我想理解为什么在传递函数名时不使用大括号,它会调用回调函数两次。

在第二种情况下,您传递的是求值结果
sayHello()
,而在第一种情况下,您传递的是实际函数
sayHello

因此,由于
sayHello
显示警报,它将在执行警报后立即显示警报。在第一种情况下,它是在
hide
完成时执行的(作为回调),而在第二种情况下,它是在设置对
hide()
的调用时执行的(可能在隐藏实际发生之前)

不确定为什么它会执行两次,但是(请参见下文)如果您希望它执行一次
hide()
完成,那么不带括号的版本(版本1)可能就是您要查找的版本

更新:

它显示两次警报的原因是您调用了两次
hide()
。您有两个不同的
元素,并且依次为每个元素调用
.hide()
(并且依次为每个元素执行回调)。我猜如果您添加第三个
标记,它将发出第三次警报

从:

如果设置了多个元素的动画,请务必注意,每个匹配的元素执行一次回调,而不是整个动画执行一次回调


您可能希望将您的元素包含在父元素(如
)中,并隐藏该元素,而不是每个单独的
元素。

这两种调用完全不同。第一个参数将函数的引用作为第二个参数传递给
hide
函数。但是,第二个函数调用
sayHello
函数,并将调用结果作为第二个参数传递给
hide
函数。
sayHello
函数在调用
hide
之前被调用。

好的,我理解逻辑。还是为什么它打了两次电话。jquery文档中说“动画完成后回调要调用的函数”@sudmong刚刚发现了答案,并用原因更新了我的答案。@sudmong,这是因为您的文档中有两个
元素
hide()
为每个隐藏的元素调用函数一次(并且
为每个调用绑定到相应的元素)。@sudmong,不,不应该。再读一遍答案。大括号(实际上是圆括号)是计算函数和调用该函数之间的区别。这是两种截然不同的行为。@sudmong正如Frédéric所指出的,带括号的版本实际上是在计算函数。因此,
sayHello
是在动画开始之前进行评估的,而不是在动画结束之后(如果你密切关注,你会注意到这一点)。这不是你想要的效果。通过使用某种承诺(检查jQuery和相关文档的
$.Deferred()
功能),您可能可以在没有包装器元素的情况下获得效果。