繁体   English   中英

为什么.done()需要匿名函数?

[英]Why does .done() require an anonymous function?

为什么这样做:

$.ajax({ url: urlIn, dataType: 'json', cache: false })
     .done( function( data ) { doStuff( data ) });

但这不是:

$.ajax({ url: urlIn, dataType: 'json', cache: false })
     .done( doStuff( data ) );

第二个“数据”没有定义。 我花了一段时间才意识到这是问题所在。 但是对我来说,它为何如此工作是一个谜。

通过调用.done( doStuff( data ) ) ,实际上是在立即 调用 doStuff函数。 传递给done函数的是它的返回值 ,在您的情况下该值等于undefined

现在,如果doStuff功能是返回一个函数本身,即函数返回然后可以称为一个回调doStuff

您要做的是将函数作为值传递而无需立即调用:

$.ajax({ url: urlIn, dataType: 'json', cache: false }).done(doStuff);

因为那些不是同一回事。

这是一个函数定义:

function( data ) { doStuff( data ) }

这是一个函数调用

doStuff( data )

它告诉代码现在执行doStuff(data)并将其结果用作回调函数。 由于data尚不存在,因此将无法使用。 (并且,如果doStuff不返回函数,则该函数将无效。)

类似的版本就是这样:

$.ajax({ url: urlIn, dataType: 'json', cache: false })
 .done( doStuff );

data将自动传递。

没有。 它只需要函数引用而不需要调用函数 匿名函数( function(){} )将是正确的函数引用,例如doStuff 但是通过执行doStuff() ,您将直接调用此函数,并且不能使用doStuff因为您需要传递参数。 因此,您应该使用function( data ) { doStuff( data ) }

它不需要匿名功能。 您确实将它传递给它一个函数引用。 因此,在您的示例中,这可以正常工作:

$.ajax({ url: urlIn, dataType: 'json', cache: false })
     .done( doStuff );

您正在做的是立即调用doStuff(data)并将其返回值传递给.done() ,这可能不是函数引用。 您必须传递一个函数引用(不带括号-因为括号使它立即执行)。

这是一个非常常见的错误。 没有括号的函数是对该函数的引用,以后可以调用该函数。 具有括号的函数将立即执行,并且将传递执行该函数的返回值。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM