ホームページ  >  記事  >  ウェブフロントエンド  >  スコープチェーンとは何ですか?関数スコープとブロックレベルスコープから分析する

スコープチェーンとは何ですか?関数スコープとブロックレベルスコープから分析する

php是最好的语言
php是最好的语言オリジナル
2018-08-06 17:18:162519ブラウズ

ES6 より前では、JavaScript にはグローバル スコープと関数スコープしかありませんでした。いわゆるスコープとは、変数が定義され、アクセスできる範囲のことです。つまり、変数がグローバル (ウィンドウ) で定義されている場合、その変数にはどこからでもアクセスできます。変数が関数内で定義されている場合、その変数は関数内でのみアクセスできます。

グローバル スコープはページが閉じていない限り常に存在します、一方、関数スコープは関数が実行されるときのみ存在し、実行後に破棄されます。そして、関数が実行されるたびに、新しいスコープが作成されます

では、スコープ チェーンとは何ですか?

スコープチェーンを理解する前に、まず実行コンテキストの概念を理解します。

実行コンテキスト: 関数が実行されると、実行コンテキスト (つまり、AO または GO) と呼ばれる内部オブジェクトが作成されます。 実行コンテキストは、関数が実行されるたびに対応する関数の実行環境を定義します。実行コンテキストは一意であるため、関数が呼び出されるたびに新しい実行コンテキストが作成され、関数の実行が完了すると、生成された実行コンテキストは破棄されます。

スコープ チェーンは、関数の [[scope]] 属性に格納される実行コンテキスト オブジェクトのコレクションです。このコレクションはチェーン リンクの形式になっています。このチェーン リンクをスコープ チェーンと呼びます。

スコープ チェーンはより包括的な関係に似ています

。たとえば、関数 A は内部で関数 B を定義しているため、B の定義は A に依存します。つまり、B が A の内部にある場合、B は A の変数とメソッドにアクセスできます。このレイヤーごとの上向きの依存関係がスコープ チェーンを構成します。 より深く理解するために、例を直接見てみましょう。

var name = 'xiaoyu';function fn1() {};function fn2() {    var num = 10;    function fn3() {        var num1 = 10;
        console.log(num);
    };    return fn3;
}var fn4 = fn2();

最後の例では、fn2 が実行されると fn3 が返され、その結果クロージャが発生することがわかります。しかし、関数が実行されてから別の関数に戻る場合、クロージャは生成されるのでしょうか?見てみましょう。

var name = 'xiaoyu';function fn1() {};function fn2() {    var num = 10;    function fn3() {//fn3函数没有依赖fn2函数内的变量
        var num1 = 10;
        console.log(num1);
    };    return fn3;
}var fn4 = fn2();

スコープチェーンを理解した後、それを統合するための小さな例を見てみましょう。

var age = 10;var obj = {
    age: 12,
    test: function() {
        console.log(age);
        console.log(obj.age);
        console.log(this.age);
    }
}
obj.test();

console.log(this.age) が 12 を出力することを理解するのは難しくありませんが、console.log(age) も 12 を出力すべきではないのはなぜでしょうか?

テストが実行されると、最初に独自のスコープ内に年齢変数があるかどうかを確認し、次にスコープチェーンを上ってグローバルスコープ内の年齢変数を見つけます。 には年齢変数とデータ変数があります。グローバルスコープ。したがって、console.log(age) は 10 を出力します。12 を出力したい場合は、obj.age にアクセスする必要があります。

ES6 のブロックレベルのスコープ

ES6 以降、ブロックレベルのスコープが let と const によって導入されました。つまり、let および const によって宣言された変数は、それらが宣言されたブロック レベルのスコープ内でのみ有効であり、let によって宣言された変数はグローバル変数ですが、グローバル オブジェクト ウィンドウには属しなくなりました。

コードの一部を通じてブロックレベルのスコープを導入した後の関数のスコープ チェーンの変更を見てみましょう。

var age = 10;
let obj = {
    age: 12,
    test: function() {
            console.log(age);
            console.log(obj.age);
            console.log(this.age);
    }
}
obj.test();

関連する推奨事項:

JavaScriptのスコープとスコープチェーンの基礎知識について話しましょう

JavaScriptのスコープとブロックレベルのスコープ

以上がスコープチェーンとは何ですか?関数スコープとブロックレベルスコープから分析するの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。