2011-02-18 224 views
9

爲了響應關於jQuery效果的this question,我想到了使用callback參數到.fadeIn(500, my_function)是繼續式編程容易堆棧溢出

雖然原則上,這是一個可行的想法,我不知道(既不擁有jQuery的文檔:()如果回調允許遞歸:

function keep_animating(){ 
    $("#id").fadeIn(500).fadeOut(500, keep_animating); 
} 

回答

3

你可以添加一個調試器斷點,測試堆棧大小是否增加:)

但是,由於動畫/衰落使用setTimeout/setInterval我高度猜測調用深度不會增加,即它不容易發生堆棧溢出。

+0

從我在源文件中可以看到的情況來看,它會執行遞歸操作。查看[速度函數](http://www.keyframesandcode.com/resources/javascript/deconstructed/jquery/#speed),它最終處理所有效果的回調函數。它使用`call()`直接執行回調,不涉及隊列。 – Tomalak 2011-02-18 15:17:03

0

您的解決方案將緩解並最終將堆棧炸燬 - 但您將有相當長的時間 - 取決於瀏覽器 - 直到它出現爲止。對於一個快速演示,這是好的,但對於生產準備代碼,你會想利用非遞歸方法,如:

function pulse(){ 
    $("#id").fadeIn(500).fadeOut(500); 
} 
setInterval(pulse, 1000); 

有很多方法對皮膚這一點,但應該讓你那裏。

1

我花時間詢問'people who know'......沒有堆棧溢出,因爲沒有明確的遞歸:fadeIn,fadeOut ...方法都只是在效果隊列上創建一個條目。這意味着keep_animating函數不是從相同的上下文中執行的。

禮貌dave methvin

你所描述的 「遞歸」 什麼是不實際的遞歸。 jQuery的 視覺效果運行在setTimeout 定時器上,所以回調函數不是 ,因爲它會在 遞歸中立即運行。取而代之的是,回調在 動畫在 完成後運行 幾個「步驟」,每個「步驟」都由 setTimeout觸發。