JS高級程序設計中對“私有作用域”的經典解釋
阿新 • • 發佈:2018-02-04
js高級程序設計 mef size 替換 沒有 color 包含 函數 16px
JavaScript從來不會告訴你是否多次聲明了同一個變量;遇到這種情況,它只會對後續的聲明視而不 見(不過,它會執行後續聲明中的變量初始化)。
匿名函數可以用來模仿塊級作用域並避免這個問題。 用作塊級作用域(通常稱為私有作用域)的匿名函數的語法如下所示。
(function(){
//這裏是塊級作用域 })();
以上代碼定義並立即調用了一個匿名函數。
將函數聲明包含在一對圓括號中,表示它實際上是一個函數表達式。而緊隨其後的另一對圓括號會立即調用這個函數。
如果有讀者感覺這種語法不太好理解, 可以再看看下面這個例子。
var count = 5;
outputNumbers(count);
這裏初始化了變量 count,將其值設置為 5。當然,這裏的變量是沒有必要的,因為可以把值直接傳給函數。
為了讓代碼更簡潔,我們在調用函數時用 5來代替變量 count,如下所示。
outputNumbers(5);
這樣做之所以可行,是因為變量只不過是值的另一種表現形式,因此用實際的值替換變量沒有問題。 再看下面的例子。
var someFunction = function(){ //這裏是塊級作用域 };
someFunction();
這個例子先定義了一個函數,然後立即調用了它。定義函數的方式是創建一個匿名函數,並把匿名函數賦值給變量 someFunction。
而調用函數的方式是在函數名稱後面添加一對圓括號,即 someFunction()。通過前面的例子我們知道,可以使用實際的值來取代變量 count,那在這裏是不是也可以用函數的值直接取代函數名呢?
然而,下面的代碼卻會導致錯誤。
function(){
//這裏是塊級作用域 //出錯!
}();
這段代碼會導致語法錯誤,是因為 JavaScript將 function 關鍵字當作一個函數聲明的開始,而函數聲明後面不能跟圓括號。
然而,函數表達式的後面可以跟圓括號。要將函數聲明轉換成函數表達式, 只要像下面這樣給它加上一對圓括號即可。
(function(){
//這裏是塊級作用域
})();
JS高級程序設計中對“私有作用域”的經典解釋