1. 程式人生 > >匿名與具名函式、函式宣告與函式表示式、立即執行函式(已完結)

匿名與具名函式、函式宣告與函式表示式、立即執行函式(已完結)

匿名與具名函式

這屬於常識性問題,但是還是有必要說說

  • 沒有函式名的函式就叫匿名函式,有函式名的函式就叫具名函式
    setInterval(function(){//匿名函式
        ...
    },1000);
    var funA = function(){//匿名函式表示式
        ...
    }

    var funB = function test(){
        ...
    }

函式宣告與函式表示式

  • 函式宣告與函式表示式的區分

區分函式宣告和表示式最簡單的方法是看function 關鍵字出現在宣告中的位置(不僅僅是一行程式碼,而是整個宣告中的位置)。如果function 是宣告中的第一個詞,那麼就是一個函式宣告,否則就是一個函式表示式。

    (function(){...}());//函式表示式

    +function test(){...}//函式表示式

    setInterval(function(){//function既不是函式宣告也不是函式表示式,只是一個引數
        ...
    },1000);    
  • 函式宣告與函式表示式的差異

函式宣告和函式表示式之間最重要的區別是它們的名稱識別符號將會繫結在何處

比較一下兩個程式碼片段:

    var a = 2;
    function foo() { 
        var a = 3;
        console.log( a ); // 3
} foo(); console.log( a ); // 2 /*---------*/ (function foo(){ var a = 3; console.log( a ); // 3 })(); console.log( a ); // 2

第一個片段中foo 被繫結在所在作用域中,可以直接通過foo() 來呼叫它。第二個片段中foo 被繫結在函式表示式自身的函式中而不是所在作用域中。

換句話說,(function foo(){ .. }) 作為函式表示式意味著foo 只能在.. 所代表的位置中被訪問,外部作用域則不行。foo 變數名被隱藏在自身中意味著不會非必要地汙染外部作用域。

立即執行函式—IIFE(Immediately Invoked Function Expression)

  • 立即執行函式的原理探究

在‘JavaScript語言精粹——P(28)’中說到——呼叫函式時,呼叫運算子(即())是跟在任何產生一個函式值的表示式之後的一對圓括號(無論以何種方式呼叫函式,其實質都是這樣的)。因此,你可能便會認為以下函式呼叫是合理的

    function test(){
        console.log('測試');
    }();
    /*當然,上述形式符合規定,但是卻報錯*/

這是因為上述不是函式表示式

你也可以這樣去理解立即執行函式:只有表示式才會被執行,那麼函式表示式當然也會被執行

ps:本文參考並引用下列書籍
《你不知道的JavaScript》(上卷)