私が読んだ記事と同じくらい多くの記事がありますが、まだいくつか質問があります。
私はすでに次のような閉鎖の使用法を知っています(そして理解しています):
悪名高いループの問題 (番号が保持された、それぞれにアラートがあるリンクのループ)
カウンターの増加(関数を呼び出し続ける->増加した数を警告する)
ここから:
外部関数のローカル変数を参照する内部関数はクロージャを作成します
ここから:
クロージャーは関数のローカル変数であり、関数が戻った後も生き続けます。または、クロージャーは、関数が戻ったときに割り当てが解除されないスタックフレームです。(あたかも「スタック フレーム」がスタック上にあるのではなく、malloc されたかのように!)
3 質問してください:
質問1
JS のすべての関数がクロージャを作成すると言われました。
何??? プライベート変数を使用して通常の関数を作成すると、スコープが作成されます。閉鎖ではありません。
閉鎖は次のように機能すると思いました:(ここから)
- 外側の「関数メーカー」関数を作成します。
- その中でローカル変数を宣言します。
- 外側の関数内で内側の関数を宣言します。
- 内側の関数内で外側の関数の変数を使用します。
- 外側の関数が内側の関数を返すようにする
- 関数を実行し、その戻り値を変数に割り当てます
例:
function functionMaker(){
var x = 1;
function innerFunction(){
alert(x);
x++;
}
return innerFunction;
}
では、なぜすべての js 関数がクロージャを作成すると彼らは言うのでしょうか?
質問2
Self-Invoking Functions
別名 IEFA -閉鎖Immediately Invoked Function Expression
を作成しますか?
見つめている
(function (a) {
alert(a);
})(4);
上記の6 つのルールのようなパターンが見当たりません: ここは正確にHave the outer function return the inner function
はどこですか? 単語が表示されませんreturn
。
質問#3
function myFunction() {
var myVar = 1;
var alertMyVar = function () {
alert('My variable has the value ' + myVar);
};
setTimeout(alertMyVar, 1000 * 3600 * 24);
}
myFunction();
myFunction
ここで一日中生きていたのですか?またはそれは直後に終了しましたsetTimeout
か?もしそうなら、どうやってその値をSetTimeOut
覚えましたか?
それを正しくするのを手伝ってください。