2012-08-01 137 views
0

我有這樣的代碼,其工作原理:arguments.callee如何實際工作?

$(document).ready(function() { 
    $("#run").click(function() { 
     $("div:animated").toggleClass("colored"); 
    }); 

    function animateIt() { 
     $("#mover").slideToggle("slow", animateIt); 
    } 
    animateIt(); 
}); 

隨着arguments.callee我們調用一個函數本身,所以我們沒有爲一個功能需要一個名字。所以這個也應該可以,但事實並非如此。誰能告訴我爲什麼?

$(document).ready(function() { 
    $("#run").click(function() { 
     $("div:animated").toggleClass("colored"); 
    }); 

    function() { 
     $("#mover").slideToggle("slow", arguments.callee); 
    } 
}); 
+5

這是無效的JavaScript。你必須給你的函數聲明一個名字。 – Esailija 2012-08-01 08:45:06

+0

@Esailija,需要引用。看起來像一個[從未使用過的匿名函數聲明](http://stackoverflow.com/a/11755677/7724)。 – bzlm 2012-08-01 08:46:59

+1

聲明變量名爲「參數」在哪裏? – 2012-08-01 08:47:31

回答

5

在最初的劇本,你聲明函數animateIt然後立即調用它,但在修改後的腳本,你宣佈關閉而沒有調用它。

你應該嘗試改變這一點:

function() { 
    $("#mover").slideToggle("slow",arguments.callee); 
} 

與此:

(function() { 
    $("#mover").slideToggle("slow",arguments.callee); 
})(); 

也就是說,你既聲明,並呼籲在同一行關閉。

請記住,據我所知,使用arguments.calleearguments.caller是相當不鼓勵,應該避免。

+2

你完成寫作之前,我有一半,有一個免費的[小提琴](http://jsfiddle.net/HAjhF/)。 – 2012-08-01 08:47:17

+0

好吧,謝謝你=),它也可以工作! – 2012-08-01 09:28:34