ホームページ >ウェブフロントエンド >jsチュートリアル >JavaScriptのスコープの詳しい説明

JavaScriptのスコープの詳しい説明

藏色散人
藏色散人転載
2019-05-07 09:15:222566ブラウズ

スコープの理解: 定義された変数と関数が有効になるスコープ。 JavaScriptにはグローバルスコープと関数スコープの2種類があります。

注: es6 は、js にネイティブではない let ブロックレベルのスコープを実装しています。最下層も var を通じて実装されます。具体的な詳細を知りたい場合は、babel 公式にアクセスして es6 で let を解析してください。

実行コンテキスト

スコープ: 段落内または関数内;
グローバル: 関数宣言、変数宣言。スコープ:;
関数: 関数宣言、変数宣言、this、引数。スコープ: 関数内;

関数と変数の宣言のプロモーション

<script>
        foo(); //打印a
        var foo = 1;
        function foo (){
            console.log(’a‘)
        };
        console.log(foo); //1
</script>


//实际的执行顺序为
<script>
        function foo(){  //函数声明优先于变量的声明
            console.log("a");
        }
        //var a ;  重复声明,这儿被省略了。
        foo(); //打印a
        foo = 1;  //给foo赋值为1
        console.log(foo); //1
</script>

JS エンジンが実行コンテキスト コード ブロックを実行するときの実行順序は次のとおりです:
1. 関数宣言 function a( ) {}; (関数が優先されます) 注: let a = function (){}; これは変数の宣言と代入であり、関数の宣言ではありません。
2. 変数宣言 var a; 注: 最初は変数のみが宣言され、値は代入されていませんが、代入前にこの変数を使用した場合、値は未定義になります。
3. 実行コンテキストが関数スコープの場合: これと引数を決定します。
4. js のシングルスレッドおよび非同期戦略に従って、スコープ内のコードを順番に実行します。

私たちは var a = 2; をステートメントとして考えることに慣れていますが、実際には JavaScript エンジンはそうは考えません。これは、var a と a = 2 を 2 つの別個の宣言として扱います。1 つ目はコンパイル時タスク、2 つ目は実行時タスクです。これは、スコープ内のどこに宣言があっても、コード自体が実行される前に宣言が最初に処理されることを意味します。このプロセスは、すべての宣言 (変数と関数) がそれぞれのスコープの先頭に「移動」されると考えることができます。このプロセスはホイスティングと呼ばれます。特に通常の var 宣言と関数宣言が混在している場合は、繰り返しの宣言を避けるように注意してください。そうしないと、多くの危険な問題が発生します。

スコープ チェーン

自由変数: 現在のスコープでは定義されていないが、上位スコープで定義されており、このスコープで使用できる変数。
スコープ チェーン: 変数を使用する場合は、まずその変数を独自のスコープ内で検索します。変数が見つからない場合は、グローバル スコープが見つかるまで親スコープ内で検索します。見つからない場合は、エラーが報告されます。 。

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

js にはブロックレベルのスコープはなく、グローバル スコープと関数スコープのみがあります。
ES6 は、グローバル スコープの特別な実装を通じて js のブロックレベル スコープ let を実装します。
let の有効スコープは { } です。
const は定義された定数です。注: 定義された定数の値が格納されているメモリ アドレスは変更できません。値が変数の場合、たとえば定数が配列またはオブジェクトとして定義されている場合、元のデータは配列またはオブジェクトのメソッドを通じて操作できます。 . 値を再代入しない限り問題ありません。

以上がJavaScriptのスコープの詳しい説明の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事はcnblogs.comで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。