多くの読書とハッキングの後、ようやく JavaScript クロージャーとその使用法を理解し始めたように感じます。しかし、私が読んだリソースのいくつかは、私には少し矛盾しているように見える方法で物事を表現しています. または、多分私はそれらを読みすぎているだけです.
helephant.com の優れた記事 (リンク) には、次のように記載されています。
クロージャーは、別の関数内にネストされた関数がその親のスコープから変数にアクセスするときに作成されます。
と...
クロージャーは、内部関数が作成されたときではなく、外部関数が終了したときに実際に作成されます。
与えられた例のコンテキストで、これらの点の両方を理解しています。
ただし、John Resig のサイト (リンク)のより基本的なチュートリアルでは、以下のコード ブロックにはクロージャーが含まれていると述べられています。
var num = 10;
function addNum(myNum){
return num + myNum;
}
addNum(5);
私が見たクロージャのほとんどの有用な例は、内部関数への参照を返し、後でそれを使って何かをします。したがって、この例は無意味に思えますが、とにかく、それが依然としてクロージャであることを受け入れて理解しようとしましょう。しかし、helephant の概念 (外部関数が終了するまでクロージャーは作成されない) を統合して少しハックしようとすると、次のようになります。
function outerFunction() {
var num = 10;
function addNum(myNum){
return num + myNum;
}
alert(addNum(0));
num = 5;
}
outerFunction();
現在、Resig によるとaddNum
、クロージャーが作成されます。helephant によると、クロージャーはouterFunction
返されるまで作成されません。ただし...クロージャー(実際にクロージャーである場合)は、終了時にnum
from beforeouterFunction
の値を使用します。矛盾?
確かに、終了する前に呼び出し たので... の現在の値を使用することは論理的に思えます。しかし、これは、彼が提示した単純な例が実際に閉鎖であるというResigの声明に疑問を投げかけます. しかし... レシグに質問する私は誰ですか? きっと私は何かを誤解していますか?addNum
outerFunction
num
これを Q&A 形式によりよく適合させるために、ここで私の質問を要約します。
(1) Resig の例 (およびさらに下にある私の拡張機能) はクロージャーですか?
(2) はいの場合、外側のスコープが戻る前に囲まれた var の値を使用するのはなぜですか?