2番目の例では、関数オブジェクト内の変数へのリンクを保持する関数オブジェクトを明示的に返します。最初の例は、単にprivate関数を呼び出した結果を返します。したがって、2番目の例はクロージャです。
はここで、より良いが閉鎖を示し、あなたの第二の例を少し変更したバージョンです:
function f(){
var a = "foo";
// return an object containing two methods
// which can access and modify the private "a"
// variable even after the function has returned
return {
showA: function() {
alert(a);
},
changeA: function(str) {
a = str;
}
}
}
var fun = f();
fun.showA(); // "foo"
fun.changeA("blahblah");
fun.showA(); // "blahblah"
フィドル:あなたが見ることができるようにhttp://jsfiddle.net/MKD6p/1
、スタックフレームは、後に割り当てが解除されていません関数が返されました。内部の変数は有効に保たれ、適切なインタフェースを使用して再生することができます。
あなたの最初の例の内部機能は、その外側のスコープへのアクセス権を持っている、とは変数に基づいて値がその外側の関数/スコープで宣言リターン/ 閉鎖を行いん。しかし、関数またはモジュールが返されていないので、関数の局所変数は、(外部)関数が戻ったときに割り当て解除されるので、内部関数は外部スコープを持つ閉包を形成しますが、実際にはクロージャが何であるかの生産的な例。
ネストされた関数がクロージャ* befroe *を生成するかどうかについて多くの議論がありました*外部関数が終了しました。内部関数は単にスコープチェーン上に外部関数を持ち、その時点ではクロージャは存在しないと主張することができる。内部関数が変数に割り当てられ、外部関数が実行を完了した後に呼び出し可能またはアクセス可能である*場合、終了があります。また、割り当てられた関数が実際にスコープチェーン上の「クローズドオーバー」変数を使用している場合にのみ、クロージャが形成されると考えるユーザーもいます。 – RobG