scope & closure


スコットランド?


変数名、関数名、クラス名などの識別子.
宣言した場所で、他のコードで参照できるかどうかを確認します.
function add (x, y){
	console.log(x, y); //선언된 위치에 다라 본인의 유효범위가 결정됨 이것이 스코프 
    return x + y 
} 

add(3, 6)

console.log(x, y) // x, y 선언 유효범위 밖이다 Error

変数がグローバルで宣言されている場合、ゾーンにグローバルscopeがある場合、ゾーンscopeがあります.
グローバルには、コードを実行するときに参照する変数はありませんが、領域にはあります.
地域にありますが、全域もありますか?こことそこにある場合、このコードはどの変数を参照しますか?
何を参照するか知りたいなら、スコフチェーンを理解する必要があります.

ひょうじチェーン


関数のオーバーラップ



このように関数が重なると、領域スキャンも重なります.
関数の重ね合わせによって、階層的な構造を持つことができます!
次のコードがゾーンスキャンで変数が見つからない場合は、親スキャンで検索します.
上司がいなければ、グローバルを探しているスコフチェーンが見えます.
var x = '나는 전역 x야'

fuction outer() { // outer 함수안은 outer scope
	var y = '나는 outer함수의 지역 y야'
    console.log(x); // 나는 전역 x야
    console.log(y); // 나는 outer함수의 지역 y야
    
    function inner() { // inner 함수안은 inner scope
    var x = '나는 inner함수의 지역 x야'
    
    console.log(x); // 나는 inner함수의 지역 x야
    console.log(y); // 나는 outer 함수의 지역 y야
    }
    inner()
}

outer()
console.log(x)
console.log(y)

いくつかの基準で分類することもできます。



ES 6以降ではletとconstキーだけでなくif,fo,try文でも
私はスコフを持つことができます.

動的および静的スキャン



JavaScriptは文法scopeに従うため,関数が生まれるとコンテキストが決まる.
関数が関数オブジェクトを生成した場合、関数オブジェクトは常に親オブジェクトを知っています.
Lexicalscopingは、関数がどこで宣言されるかではなく、関数がどこで呼び出されるかによって決定されます.(逆に、どこから調整して範囲を決定するかによって動的役割ドメインが決定される).
関数は、内部スロットにミラー参照を格納します.

関数呼び出し時


const x = 1;

function outer() { outer함수는 inner를 ella에게 반환하면서 생을 마감한다..
	const x = 10;
    const inner = fuction () {
    	console.log(x)  
    };
    return inner
}
const ella = outer();
ella(); // 어떤 값이 콘솔에 찍힐까?

  • outer関数はinnerをellaに返し、生命を終了します.
    outer()関数呼び出しが終了すると、実行コンテキストがスタックから削除されます.
    outerの領域変数x=10;取り除くこともできる
    しかしella();で、10の値は出力されます

  • 死んだxはどうやって復活したの??
    クロゼが
  • エンクロージャ


    ネストされた関数の内部で、ライフサイクルが終了したouter関数(外部関数)領域変数xを参照できる場合
    このとき内部をCloserと呼ぶ
    outerはライフサイクルを終了したが、outerのLexical環境は依然として存在するため、inner関数は内部スロットに格納された親scopeに依存してouterのLexical環境を参照する.

    整理したCloserは?


    重ね合わせ関数

  • 位相スキャンの識別子、
  • を参照
  • 本人の外部関数よりも長く生きている場合、
  • Closerによって参照される変数をフリー変数と呼びます
    「Closer」クローズ感のある名前は,関数本人の記憶にある自由変数に囚われていると考えられる.
    これらのモジュールは、予期せぬ変更を回避するためにstateを非表示にします.
    特定の関数のみがステータスを変更できます.
    注意:https://www.youtube.com/watch?v=PVYjfrgZhtU&t=187s