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

时间:2014-11-07 17:49:27

标签: javascript jquery

为什么这样做:

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

但不是这样:

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

第二个"数据"没有定义。我花了一段时间才意识到这就是问题所在。但它对我来说是神秘的,为什么它会那样。

4 个答案:

答案 0 :(得分:10)

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

现在,如果doStuff函数本身返回一个函数,则返回的函数可以被doStuff作为回调调用。

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

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

答案 1 :(得分:6)

因为那些不是同一件事。

这是一个函数定义:

function( data ) { doStuff( data ) }

这是一个函数调用

doStuff( data )

它告诉代码现在执行doStuff(data) 并使用其结果作为回调函数。由于data尚不存在,因此无法正常工作。 (如果doStuff没有返回功能,那就不会有效。)

类似的版本就是这样:

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

data将自动传递。

答案 2 :(得分:1)

它没有。它只需要功能参考不需要调用函数。匿名函数(function(){})将是正确的函数引用,因此doStuff。但是通过执行doStuff(),您直接调用此函数,因为您需要传递参数,所以无法使用doStuff。所以你应该使用function( data ) { doStuff( data ) }

答案 3 :(得分:1)

它不需要匿名功能。你确实让它传递了一个函数引用。所以,在你的例子中,这可以正常工作:

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

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

这是一个非常常见的错误。没有parens的函数是对该函数的引用,可以在以后调用。具有parens的函数立即执行,而执行函数的返回值则被传递。