簡體   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