JavaScriptコードの事前解析+例の詳細について説明します.

3945 ワード

概念
  • varによって宣言された変数は、前解析時に声明のみを実行し、定義は実行されません.標準値はundefinedです.
  • functionによって宣言された関数は、事前に宣言され、同時に定義される.
  • 変数名重複宣言無効
  • 事前解析されたコードは、再実行されない段階で
  • を実行します.
    例1
    console.log(a);  //     a   (function a() { console.log('a') })
    
    var a = 10;
    
    console.log(a);  // 10
    
    function a() { console.log('a') }
    
    console.log(a);  // 10
    
    前解析プロセス
  • は、まず変数aが存在することを事前に解析し、aという名前と、その値undefined
  • とを記録した.
  • は次いで、関数aの宣言を前解析し、関数名a
  • を記録する.
  • しかし、aが記録されていることがわかったので、この動作は無効であり、関数体をaという名前に関連付ける
  • .
  • 解析完了
  • 前解析プロセスコード
  • a = undefined
  • a = function () { console.log('a') }
  • 前解析結果
  • a = function () { console.log('a') }
  • 実行プロセス
  • プリント変数aの値function a() { console.log('a') }
  • 変数aは、10に割り当てられ、元の関連する関数を
  • に上書きする.
  • プリント変数aの値10
  • プリント変数aの値10
  • 実行完了
  • 実行プロセスコード
  • console.log(a)
  • a = 10
  • console.log(a)
  • console.log(a)
  • 例2
    console.log(fn)  //   fn   (function fn() { console.log(2) })
    
    function fn() { console.log(1) }
    
    console.log(fn)  //   fn   (function fn() { console.log(2) })
    
    var fn = 10    
    
    console.log(fn)  // 10
    
    function fn() { console.log(2) }   
    
    console.log(fn)  // 10
    
    前解析プロセス
  • は、まず関数fnによって宣言されたことを事前に解析し、fnという名前を記録し、関数
  • に関連する.
  • は次いで、変数fnの宣言にプリ解析し、変数名fn
  • を記録する.
  • ですが、fnが記録されていることが分かりましたので、この操作は無効です.
  • は次いで、関数fnによって宣言されたことを事前に解析し、fnという名前
  • を記録する.
  • しかし、fnが記録されていることが判明したので、この動作は無効となり、次いで、その関数
  • に関連する.
  • 解析完了
  • 前解析プロセスコード
  • fn = function () { console.log(1) }
  • fn = function () { console.log(2) }
  • 前解析結果
  • fn = function () { console.log(2) }
  • 実行プロセス
  • プリント変数fnの値function fn() { console.log(2) }
  • プリント変数fnの値function fn() { console.log(2) }
  • 変数fnは、10に割り当てられ、元の関連する関数を
  • に上書きする.
  • プリント変数fnの値10
  • プリント変数fnの値10
  • 実行完了
  • 実行プロセスコード
  • console.log(fn)
  • console.log(fn)
  • fn = 10
  • console.log(fn)
  • console.log(fn)