2012-03-22 5 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

はい。 –

答えて

6

クロージャーは "getMyVar"関数の周りにあります。変数 "myVar" 内のコンストラクタはローカル変数です。ではなく、 "getMyVar"からの戻り値を除き、関数外に表示されます。

オブジェクトの "myVar"プロパティを設定するだけで、 "getMyVar"関数はオブジェクトのプロパティを返さない。クロージャー内のローカル変数の値を返しています。

2

はい、そうです。

あなたが別の関数の内部で関数を定義すると、内側の関数は外側の関数のローカル変数のすべてをへのアクセス権を持っている...あなたの場合

getMyVarmyVarへのアクセスを持っている - によって閉鎖。

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; 
    } 
} 
関連する問題