2014-01-21

[JavaScript] 匿名 function 進階應用

前幾天 JS 新手村的同事說看不懂下面的程式,下面用了幾個問句解釋了他的疑惑。
(function(model){
    //...
})(model || model={});

JS 要如何宣告一個 function 呢?
function a(){
    //...
}

那改成變數的方式宣告呢?
var a = function(){
    //...
};

要怎麼呼叫上面宣告的 function?
a();

再來把 a 換成等於右邊的 function 宣告。
function(){
    //...
}();

上面的寫法不符合語法,再加上 () 吧!
(function(){
    //...
})();


接著 model || model={} 是透過 or 判斷句的特性,遇到第一個為真就回傳,看看下面的例子:
var a = 1 || 2 || 3;  // 1
var a = 0 || 2 || 3;  // 2
var a = 0 || 0 || 3;  // 3



為什麼要用這種寫法呢??

首先 JS 沒有所謂的 block 變數,在 for 內宣告的變數,外面也能直接存取,唯一能侷限變數存取域的只有 function,在 function 內宣告的變數只有內部能存取,外部是看不見的,所以透過這個方法可以避免變數命名衝突的問題。

再來透過傳入 function 的變數,外部是無法在更動的,變數的參考點在呼叫 function 就固定下來,外部無法在異動內部所存取的參考點,這樣可以避免參考的變數內容被其他套件程式修改,而造成執行錯誤。

0 回應: