Javascript Closure
1.コピー(エンクロージャ)
클로저
とは、내부함수
が외부함수
に近づくことができるコンテキストを指す.ここでcontextは韓国語で直訳すると「文脈」を意味し、コードの
실행 환경
と簡単に理解される.클로저
とは、내부함수
が외부함수
に近づくことができる실행 환경
を意味する.2.モジュールの理解
まず、このモジュールを理解して使用するには、
전역변수
および지역변수
scope
とlexical scoping(렉시컬 스코핑)
を理解する必要があります.必要:Scope
2-1. グローバル変数
グローバル変数が構成部品またはページ内にある場合
これは、スクリプト領域の任意の場所で使用できる変数を意味します.
2-2. ゾーン変数
領域変数は、関数で定義された変数です.
この関数でのみ使用される変数を表します.
一般に、変数は、ブロック
{}
内または関数内で近似することができる.2-3. 語彙範囲チェック
もしあなたがスコフについて一定の理解があれば、必ずいくつかのことを知っていなければなりません.
スキャンは、関数を呼び出すときに発生するのではなく、宣言時に発生することを知っておく必要があります.
これは静的パースビューとも呼ばれる.
次のコードの結果を推定します.
let name = 'kingmo'
function log() {
console.log(name)
}
function wrapper() {
name = 'haha'
log()
}
wrapper()
wrapper()
が呼び出されると、コンソールには「haha」が表示されます.これは簡単なので、呼び出す前にnameを「haha」に変更します.
では、次のコードを見てみましょう.
let name = 'kingmo'
function log() {
console.log(name)
}
function wrapper() {
let name = 'haha'
log()
}
wrapper()
ここで、wrapper()
のコール結果はどうなりますか?同じ「ハハ」が出てくるのでしょうか?
いいえ、コンソールに「kingmo」が写っています.
これは関数を宣言するときに発生するためです.
log()
関数のname
は、wrapper()
の領域変数nameではありません.グローバル変数nameを指します.
これは
lexical scoping(렉시컬 스코핑)
と呼ばれています.もう少し簡単に説明しましょう.
初めて関数を宣言したときの関数内部の変数
스코프 체인
におけるミラーに最も近い位相範囲の変数を参照する.したがって、
log()
関数のname変数は宣言時に最近のグローバル変数nameを参照してください.
wrapper()
関数でlogが呼び出されても参照地域変数
name = 'haha'
ではありません.参照グローバル変数
name = 'kingmo'
.2-4. モジュールモード
JavaScriptコードを使用してコラボレーションを行う場合は、グローバル変数の作成は避けてください.
これは、変数が混在し、偶然同じ変数名が使用される可能性があるためです.
既存の変数を覆う不吉なことが起こるからだ.
ES 6では、
var
ではなくlet
、const
として変数が宣言される.上記の理由で.
ここでは最初から変数を関数に宣言し、
この関数を呼び出す前に、宣言がないことを確認してください.
変数を
비공개
に設定する方法もあります.次のコードで、
let another = function () {
let x = 'local';
function y() {
alert(x);
}
return { y: y };
}
let newScope = another();
newScope
は、宣言と同時のanother
の戻り値として割り当てられる.ここで返される値は
{ y: function() { alert('local') } }
です.newScope
という名前のネーミングスペース(変数名)を介して変数yにアクセスできますが、変数xにアクセスできません.
ここでyは
공개변수
x,비공개 변수
と見なすことができる.他の言語とは異なり、JavaScriptでは、
非公開関数に特化した構文、例えば
private
およびprotected
がないためである.上記の方法で
비공개 변수
機能を作成して使用できます.このパターンは
모듈 패턴
とも呼ばれる.次のコードで、
function aaa() {
let apple = "이건 사과에요"
return function bbb() {
let banana = "이건 바나나에요"
console.log("안녕하세요")
console.log(apple)
console.log(banana)
}
}
呼び出し
aaa()
関数は、bbb()
関数を返します.ここから
aaa()()
からbbb()
の関数を一度に返すことができます.console.log(apple)
に注目します.ここで、変数
apple
もbbb()
関数の内部に作成された変数ではない.aaa()
関数のパラメータでもありません.このような
apple
のような変数は、上述した비공개 변수
である.上のようなドアは
클로저
です.内部関数
bbb()
が外部関数aaa()
環境にアクセスし、이건 사과에요
という名前のコンソールを出力することがわかる.클로저
は비공개 변수
からなるからです.ユーザー・アクセスの防止、たとえば
予想外の行動を防ぐことができます.
したがって,エンクロージャはJavaScriptでユーザを制御する基本手法である.
参照1
参照。
Reference
この問題について(Javascript Closure), 我々は、より多くの情報をここで見つけました https://velog.io/@kingmo/Javascript-Closureテキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol