2012-03-22 81 views
1

我有這個....這是一個JavaScript關閉?

function MyFunction() { 
    var myVar = "I think I am encapsulated"; 

    this.getMyVar = function() { 
     return myVar; 
    } 
} 

var myProperty = new MyFunction(); 
console.log(myProperty.getMyVar()); 

myProperty.myVar = "you're not encapsulated"; 
console.log(myProperty.getMyVar()); 

它輸出: 「我想我封裝的兩倍」。爲什麼?我不認爲這是一個封閉...

+2

是的,這是一個封閉。 – 2012-03-22 20:21:03

回答

6

封閉是圍繞「getMyVar」函數。變量「myVar」裏面的的構造函數是一個局部變量,並且而不是在函數外可見,除了作爲「getMyVar」的返回值。

在對象上設置「myVar」屬性就是這樣做的,但「getMyVar」函數沒有返回對象的屬性;它返回閉包中局部變量的值。

2

是的。

當你定義另一個函數的內部函數,內部函數可以訪問外部函數的局部變量的所有 ...

在你的情況,getMyVar訪問myVar - 通過關閉。

2
var myVar = "I think I am encapsulated"; 

this.getMyVar = function() { 
    return myVar; 
} 

這是一個封閉,並且從創建功能將被返回時的myVar可變。注意這是一個局部變量,因此在此函數退出後沒有其他方式可以訪問它。

var myVar = "I think I am encapsulated"; 

請注意,這不是this.myVar(你與myProperty.myVar後設置變量)。

也許你正在試圖做的是:

function MyFunction() { 
    this.myVar = "I think I am encapsulated"; 

    this.getMyVar = function() { 
     return this.myVar; 
    } 
}