![](/img/trans.png)
[英]Does Jasmine's toThrow matcher require the argument to be wrapped in an anonymous function?
[英]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.