2013-02-09 102 views
0

我想了解爲什麼當我使用回調函數和閉包時,我得到了不同的結果。顯示在控制檯關閉和爭論混淆

var cb = function(){ 
    console.log("anim done"); 
} 

var anim = Raphael.animation({ 
    transform: 't0, 100' 
}, 2000, cb); 

circle.animate(anim); 

當運行此,所討論的圓動畫,和2秒後的一個「動畫完成」消息:

第一種情形。

第二場景:

var cb = function(msg){ 
    console.log("anim done"); 
} 

var anim = Raphael.animation({ 
    transform: 't0, 100' 
}, 2000, cb("test")); 

circle.animate(anim); 

這導致回調(CB)被立即執行。這導致「即將完成」消息立即顯示。

有人可以澄清這裏發生了什麼嗎?

+1

你的第二種情況是錯過了大括號。 – Bergi 2013-02-09 01:28:05

+0

它沒有注意到任何缺失的大括號。 – Genu 2013-02-09 01:33:17

+0

我已經添加了。它應該給出一個相當大的語法錯誤:-) – Bergi 2013-02-09 01:42:49

回答

0

當您提供回調時,它必須是一個函數。 cb("test")不是函數 - 它是函數的返回值。如果你從cb("test")返回一個函數,它會按預期工作。

正因爲如此,你應該這樣做:

var anim = Raphael.animation({ 
    transform: 't0, 100' 
}, 2000, function() { 
    cb("test"); 
}); 

這樣你傳遞一個函數,而不是已評估的表情,動畫。

+0

這是有道理的。謝謝 – Genu 2013-02-13 11:52:16

1

當你把一個函數名全部由自己,它只是計算的函數(函數名稱是本質上只是一個變量,其值的功能。

當您按照帶括號的函數名,這意味着使用給定的參數調用該函數,該值是函數的返回值

如果您想傳遞一個函數來調用該函數,則必須使用function關鍵字:

var anim = Raphael.animation({ 
    transform: 't0, 100' 
}, 2000, function() {cb("test")});