ブロックレベルの役割ドメインと関数の役割ドメイン

7056 ワード

関数の役割ドメイン:変数は定義された環境およびネストされたサブ関数でどこにでも表示されます.≪ブロック・レベル|Block Level|oem_src≫:変数は、定義されたブロック・レベル・コードから離れた直後に回収されます.
関数のスコープ
ES 6以前、jsの役割ドメインは2つしかなかった:関数役割ドメインとグローバル役割ドメイン.varを使用して宣言された変数には、変数の昇格プロセスがあります.
    console.log(a); //undefined
    console.log(c); //undefined
    console.log(d); //function d() {}
    console.log(b); //  ,b is not defined
    
    var a = 0;
    let b = 1;
    var c = function () {

    };
    function d() {
        
    }

let宣言を使用する変数は昇格せず、関数宣言は完全に昇格することがわかります.上のコードは次のようなものです.
    var a;
    var c;
    function d() {}
    
    console.log(a);
    console.log(c);
    console.log(d);
    console.log(b);
    
    a = 0;
    let b = 1;
    c = function () {

    };
  

ブロックレベルのスコープ
ES 6ではブロックレベルの役割ドメインが定義されており、letで宣言された変数はブロックレベルの役割ドメインにしかアクセスできず、「一時的なデッドゾーン」の特性がある(つまり宣言前に使用できない).
'use strict';
var test = 1;
function func(){
    //  test  
    console.log(test); //  , test is not defined.
    let test = 2;
};
func();


関数は、自分のアクティブなオブジェクトから始まり、testを探している間に、自分の役割ドメインにletが宣言されていることに気づき、上を探すことはありません.letは宣言する前に使用できないので、エラーを報告します.
自分の理解
『jsハイウェイ』では、ES 6以前、jsにはブロックレベルの役割ドメインがなかったと述べていますが.しかしwith文とtry-catch文にはブロックレベルの役割ドメインに似た場所があると思います.
    var l = {
        x: 0,
        y: 1
    };

    function f() {
        with(l) {
            console.log(x); //0
            var a = 1;
        }

	cosnole.log(a); //1
        console.log(x); //  ,x is not defined.
    }

    f();


関数fはwith文を用いて独自の役割ドメインチェーンを拡張し、with文が実行を開始すると、パラメータlに含まれるすべての変数がその関数のアクティブオブジェクトに一時的に追加され、文の実行が終了するまで削除される.これらはwith文ブロックでのみ有効です.もう1つは、with文で宣言された変数aは、varで宣言された変数が最も近い環境に自動的に追加され、aに最も近い環境が関数のローカル環境であるため、aは関数のアクティブオブジェクトに追加され、with文以外でもアクセスできる.