为什么这样做:
$.ajax({ url: urlIn, dataType: 'json', cache: false })
.done( function( data ) { doStuff( data ) });
但不是这样:
$.ajax({ url: urlIn, dataType: 'json', cache: false })
.done( doStuff( data ) );
第二个"数据"没有定义。我花了一段时间才意识到这就是问题所在。但它对我来说是神秘的,为什么它会那样。
答案 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的函数立即执行,而执行函数的返回值则被传递。