JavaScriptの作用領域と語法の分析を簡単に述べます.

2684 ワード

スコープ&スコープチェーン
JSでは、スコープは関数によって分類され、関数のスコープは定義段階で決定された.
  • の最外層関数と最外層で定義された変数は、グローバルスコープ
  • を有する.
  • 宣言されていません.直接付与された変数は、グローバルスコープ
  • を有しています.
  • 関数内部で定義された変数は、局所作用領域
  • を有する.
  • はまた、すべてのwindowオブジェクトの属性と方法が大域的な作用領域を持っているので、alert()window.alert()を呼び出しても効果は同じです.(windowオブジェクトの詳細方法は、JavaScript基礎3を参照)
  • 関数ネストが発生するとドメインチェーンが発生します.インタプリタは変数を検索する時、作用ドメインチェーンによって、内から外まで探します.見つけたら止まって、異常を見つけられません.
    AOオブジェクト&品詞分析
    JSコードの運行は二つの段階に分けられます.まず品詞分析を行ってから実行します.
    一つの関数が呼び出された瞬間に、アクティブなオブジェクトAOが生成され、そのオブジェクトに属性を塗りつぶします.
    語法分析は作用範囲チェーンによって、外から中まで分析を行い、三つのステップに分けます.
  • 分析モザイク/実参
  • は、変数宣言を解析する(なお、変数の値は実行時に決定される)
  • .
  • 分析関数宣言
  • 次の例を通して説明する.
    function bar(age) {
            console.log(age);
            var age = 99;
            var sex= 'male';
            console.log(age);
    
            function age() {
                alert(123)
            }
    
            console.log(age);
            return 100;
    }
    
    bar(5);
    
    /*     
    ƒ age() { alert(123) }
    99
    99
    100 -    
     */
    説明:
  • bar関数を呼び出した瞬間、AO
  • を生成する.
  • 分析モザイク/実参:
  • 関数宣言時のイメージパラメータは、AOの属性として、デフォルト値undefined、すなわちAO.age=undefined
  • である.
  • は、参加5を受信し、AO.age属性に値を割り当て、すなわちAO.age=5
  • を与える.
  • 変数宣言の解析:
  • AOがまだこの属性がない場合、追加する.もしあるならば(再声明に相当します)、いかなる操作を実行しないで、もとの値は消えてなくなることはできません.
  • 第3行は、ステートメントvar ageを発見し、AO.ageが既に存在していると判断し、いかなる処理も行わない.
  • 第4行、ステートメントvar sexを見つけて、AO.sex=undefined
  • を追加します.
  • 分析関数宣言:
  • AOがまだこの属性がない場合、追加する.もしあるならば、直接覆います.
  • 第7行は、function age() {...}の声明を見つけると、元のAO.age=5をカバーし、AO.age=function age(){}
  • になる.
  • 実行プロセス:
  • が第2行console.log(age)を実行すると、現在のAO.age=function age(){……——出力関数
  • が第3行age = 99を実行するとき、AO.ageに対して99
  • を割り当てます.
  • が第4行sex= 'male'を実行すると、AO.sexに対してmale
  • を割り当てます.
  • が第5行console.log(age)を実行する場合、AO.age=99は出力99
  • です.
  • は、7行目のfunction age() {...}関数宣言は、語法分析段階が完了しているので、動作しないことに注意してください.
  • が第11行を実行し、console.log(age)が実行されると、AO.ageはまだ99である.出力99
  • .
  • foo関数は100
  • に戻る.