![](/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.