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

Raf*_*sta 0 javascript jquery

为什么这样做:

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

但不是这个:

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

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

Mar*_*ulz 10

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

现在,如果doStuff函数本身返回一个函数,那么返回的函数可以被调用为回调函数doStuff.

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

$.ajax({ url: urlIn, dataType: 'json', cache: false }).done(doStuff);
Run Code Online (Sandbox Code Playgroud)


Dav*_*vid 6

因为那些不是一回事.

这是一个函数定义:

function( data ) { doStuff( data ) }
Run Code Online (Sandbox Code Playgroud)

这是一个函数调用:

doStuff( data )
Run Code Online (Sandbox Code Playgroud)

它告诉代码doStuff(data) 现在执行并使用其结果作为回调函数.既然data还不存在,那就行不通了.(如果doStuff不返回函数,那将无效.)

类似的版本只是这样:

$.ajax({ url: urlIn, dataType: 'json', cache: false })
 .done( doStuff );
Run Code Online (Sandbox Code Playgroud)

data 将自动传递.