這帶來的好處是內部函式可以訪問定義它們的外部函式的引數和變數。
首先,我們來構造一個簡單的物件。
複製程式碼 程式碼如下:
var testObj = {
value: 10,
add: function(inc){
e += (typeof inc === "number") ? inc : 1;
}
};
();
e; // 11
(2);
e; // 13
這樣寫就有一個問題,value值不能保證不會被非法修改,可以按如下的方法進行修改。
複製程式碼 程式碼如下:
var testObj = (function(){
var value = 10;
return {
add: function(inc){
value += (typeof inc === "number") ? inc : 1;
},
getValue: function(){
return value;
}
};
})();
();
alue(); // 11
(2);
alue(); // 13
我們可以通用呼叫一個函式的形式去初始化testObj,該函式會返回一個物件字面量,函式裡定義了一個value變數,該變數對add和getValue方法總是可用的,但函式的作用域使得它對其他的程式來說是不可見的。同時,我們還可以得出一個結論,內部函式擁有比它的外部函式更長的.生命週期。
我們再繼續看一個建構函式呼叫的例子。
複製程式碼 程式碼如下:
var MyObj = function(str){
us = str;
};
tatus = function(){
return us;
};
var obj = new MyObj("javascript");
tatus(); // "javascript"
這樣寫並沒有錯,但是會有一點“多此一舉”,為什麼要用一個getStatus方法去訪問一個本可以直接訪問到的屬性呢?如果status是私有屬性,那當然才有意義。
複製程式碼 程式碼如下:
var obj = function(status){
return {
getStatus: function(){
return status;
}
};
};
var myObj = obj("javascript");
tatus(); // "javascript"
這裡當我們呼叫obj的時候,它返回包含getStatus方法的一個新物件,該物件的一個引用儲存在myObj中,即使obj已經返回了,但getStatus方法仍然享有訪問obj物件的status屬性的特權。getStatus方法並不是訪問該引數的一個副本,它訪問的就是該引數本身。這是可能的,因為該函式可以訪問它被建立時所處的上下文環境,這被稱為閉包。