JavaScript scope(スコープ)

1876 ワード

Scope(スコープ)
*注:ES 6の前にはJavaScriptはブロックレベルのスコープがなく、グローバルスコープと関数スコープだけがあります.ES 6の到来により、「ブロックレベルスコープ」を提供してくれます.コマンドletとconstを追加することで、 を表現します.letまたはconstで宣言する変数と定数は、Hoistingによっては上昇しません.
1.作用域とは?
  • 現在の実行コンテキスト.値と表式は、「可視」またはアクセスされたコンテキストにあります.変数または他の表現が「現在のスコープ内」である場合、それは利用できません.作用領域はコード階層によってもよく、副作用領域が親作用領域にアクセスできるようになるため、通常はチェーンに沿って作用するドメインチェーンを検索することを指し、親作用領域から副作用領域の変数および参照を引用することができない.
  • 関数は、JavaScriptではクローズドパケットとして機能し、一つのfunctionは、通常は関数参照を返すクローズドパケットを生成するので、外部作用領域(現在の環境下では)からクローズド内部の作用領域にアクセスできる機能領域を作成した.関数で定義されている変数は、関数の外部または他の関数からアクセスできません.例えば、以下は無効です.
    function exampleFunction(){
        //x    exampleFunction      
        var x = "declared inside function";
        console.log("Inside function");
        console.log(x);
    }
    
    //  error
    console.log(x);
     
  • しかし、変数は関数外で大域変数として宣言されているので、以下のコードは有効である(現在のスコープには存在しない変数と参照は、スコープチェーンに沿って探し続けている).
    var x = "declared outside function";
    exampleFunction();
    
    function exampleFunction(){
        console.log("Inside function");
        console.log(x);
    }
    
    console.log("Outside function");
    console.log(x);
  •  宣言されていない変数の割り当ては、自動的にグローバル変数になります.例えば、下記のコードは大域変数carNameを宣言します.すなわち、関数内で赋値を実行しました. 
  • exampleFunction();
    
    //          x   
    
    function exampleFunction(){
        x = "hello";
    }
  • は、1つの関数(foo)が内部関数(bar)参照に戻るとき、barはfooの作用領域参照を保存することを追加する.
  • function foo(){
        const str = "bar in foo";
    
        return function bar(){
            return str;
        }
    
    }
    
    var fun = foo();
    fun();//"bar in foo"
    *注:すべての現代ブラウザは「厳格モード」をサポートしています.JavaScriptを実行します.厳密モードではグローバル変数は自動的に作成されません.スクリプトや関数の先頭に「use strict」を追加することで、厳密モードを宣言します.以下のバージョンのブラウザは「厳格モード」をサポートします.
  •  バージョン10以降のIE
  •  バージョン4以降のFirefox
  •  バージョン13以降のChrome
  • バージョン5.1以降のSafari
  • バージョン12以降のOpera