2009-03-03 43 views
4

當我代碼:自我調用功能

var a = 
function() 
{ 
    alert("44") 
    return function(){alert(33)} 
}()(); 

是這種表達按照以下順序進行評價?

  1. 定義函數;
  2. 通過其參考指針
  3. 一個()被調用在邁上了一個新的函數指針
  4. 一個()被再次調用

如果是這樣,爲什麼我有一個語法

  • 回報錯誤,如果我做的:

    function() 
    { 
        alert("44") 
        return function(){alert(33)} 
    }(); 
    

    翻譯首先要左操作數...

    但是這句法作品:

    (
        function() 
        { 
        alert("44") 
        return function(){alert(33)} 
        }; 
    
    )() 
    

    外括號什麼呢???意義

    感謝

  • 回答

    3

    這是語言的語法。如果你想就地執行一個匿名函數,你必須把它放在parens中。

    JS有這些邊緣情況下,語法比你想象的更爲奇怪。舉個例子,除非用parens包裝,否則評估具有JSON的字符串不起作用。

    // Wrong 
    eval("{ ... }"); 
    // Right 
    eval("({ ... })"); 
    

    這是語言的語法。

    這就是說,我認爲(這是嚴格的恕我直言),你列出的步驟是不準確的。

    1. 函數被定義和調用。警報( 「44」);作爲結果發生。
    2. 該函數返回另一個也被調用的函數。警報( 「33」);發生。
    3. 最內層的函數不返回任何東西,所以a實際上是未定義的。 typeof a returns「undefined」。
    3
    1. function() { alert("44") return function(){alert(33)} } 您定義的功能
    2. function() { alert("44") return function(){alert(33)} }() 你調用該函數返回匿名函數function(){alert(33)}
    3. function() { alert("44") return function(){alert(33)} }()() 你調用返回的功能,所以它實際上是等同於function(){alert(33)}()

    所以整個執行等同於:

    alert("44"); alert(33); 
    
    0

    我剛學習自調用函數。
    我想代碼應該是 3. (function() { alert("44"); return function(){alert(33);} })()()