私が理解しているように、クロージャは、関数とパラメータを関数の外部にリンクし、関数内のものがその関数にアクセスできるようにする環境を作ります。なぜクロージャ環境で変数の宣言が機能しませんでしたか?
以下は、クロージャ付きの関数です。私はこの機能を3回実行します。私は実行たびに追加ので、私は()、1を取得する必要があり、それは0としてカウンタを再宣言し、1を追加することを期待
add();
add();
add();
だから、カウンタ= 0、カウンタ++、カウンタ= 0、カウンタ++、カウンターでなければなりません= 0、カウンタ++。しかし、なぜそれがであることが判明しましたか?
var add = (function() {
var counter = 0;
return function() {return counter += 1;}
})();
function myFunction(){
document.getElementById("demo").innerHTML = add();
}
2番目の質問は次のとおりです。
variable = (function() {})()
我々は関数の後に機能を囲むために、余分な括弧を追加し、なぜ別の余分な括弧のはなぜ?
ありがとうございます!
申し訳ありませんが、私は理解していない関数は行ごとに実行する必要はありませんか? addが呼び出されるたびに、var 'counter = 0'を実行し、' return'を正しく実行する必要がありますか? –
* "関数は行単位で実行するべきではありません" *もちろんです。 *「追加が呼び出されるたびに、実行する必要があります...」*いいえ、私が答えで説明したように、*「追加」はIIFEから**返されている**関数を指します。 function(){return counter + = 1;} '。*私はいくつかの情報を追加しました。また、 'console.log(add)'を実行し、 'add'の値が何であるかを見ることもできます。 –
詳細な説明をありがとう!私はそれを試してみよう〜 –