レプリカ
7258 ワード
主にjavascriptとpythonを用いるため,関数に関数が含まれているとは思えない.ただし、javaがプライマリメソッド内でメソッドを定義および使用しようとすると、エラーが発生します.
javascriptでは、内部関数が外部関数にアクセスできる脈絡をcloserと呼びます.
グローバルscopeでは、
まあいいけど、よく考えたら、
これにより、
しかし、
モジュールは、内部関数が外部関数の脈絡にアクセスできるだけでなく、内部関数で外部関数の変数を使用すると、内部関数が終了するまで変数は変わらないことを示します.
closureの概念を学習する場合、settimeoutに関連付けて説明することがあります.
しかし、
わかりにくい settimeoutの最初のパラメータ匿名関数でiを使用します.次に、2番目のパラメータでiを使用して間隔を置きます. の2番目のパラメータでは、間隔に使用されると、直ちにiが呼び出される. の最初のパラメータ匿名関数では、iの使用は、外部関数countSec()が終了するまでの時間が経過したため、閉パケットが形成される. で呼び出されたiの値は繰り返しチェックされ、すでに11であり、コンソールは1秒おきに11の値を出力する. では.必要に応じてどのように出力しますか?
モジュール-生活コード モジュール-JavaScript-MDN Web Docs settimeout例のclosure [Javascript ES6] 1. ES 6(let,closure)-今日もうなずく
javascriptでは、内部関数が外部関数にアクセスできる脈絡をcloserと呼びます.
エンクロージャ
function outter() {
let text = 'text in outter';
function inner() {
console.log('use ' + text);
}
inner();
}
上記のコードでinner
と定義されている関数では、text
という変数が使用されます.inner
関数内のtext
は定義されていないので、外部関数outter
で定義されたtext
が検索されて出力される.このように,内部関数が外部関数にアクセスする脈絡を閉パケットと呼ぶ.妖怪
function outter() {
let text = 'text in outter';
function inner() {
console.log('use ' + text);
}
return inner;
}
let call = outter();
call(); // use text in outter
上記のコードから見ると、inner
関数はoutter
の内部に定義された関数である.outter
関数は、定義されたinner
関数を返します.グローバルscopeでは、
call
という変数にoutter
関数の実行結果(内部定義のinner
関数を渡す)を渡し、call
を実行するとuse text in outter
という値を呼び出す.まあいいけど、よく考えたら、
inner
は、text
という名前の変数を使用します.これにより、
outter
関数で定義された値が得られます.しかし、
outter
関数は、call
を呼び出す前に使用され、終了した可能性がありますが、どのようにして値を取得しますか?モジュールは、内部関数が外部関数の脈絡にアクセスできるだけでなく、内部関数で外部関数の変数を使用すると、内部関数が終了するまで変数は変わらないことを示します.
もっと妖しい
closureの概念を学習する場合、settimeoutに関連付けて説明することがあります.
function countSec() {
for (var i = 1; i <= 10; i++) {
setTimeout(() => {
console.log(i);
}, i * 1000)
}
};
countSec();
console.log('외부함수 종료');
上のコードでは、1から10まで1秒ごとに出力するために書かれたコードが見られます.しかし、結果として11は1秒ごとに出力される.setTimeout(f, time)
は、実行時間(ms)後のfを許可するコードである.(非同期運転)setTimeout
i
の値を取ってそのまま使用します.このため、1秒ごとに出力することができる.(このとき、i
は11の値で文を繰り返します.)しかし、
setTimeout
の匿名関数は、外部関数の終了後に呼び出される.したがって、사라지지 않은 i
の値が得られ、実行されるモジュールが形成される.しかし、既にi
の値が11であるため、出力11となる.わかりにくい
letを使用します。
var
とlet
の差で、複文ではvar
ではなく、let
で、自由に出力できます.let
はブロックスキャンを有するので、ブロックが有する特定の変数を記憶し、その変数を参照する.リファレンス
Reference
この問題について(レプリカ), 我々は、より多くの情報をここで見つけました https://velog.io/@sinf/js-closureテキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol