1. 程式人生 > >js的預解析機制

js的預解析機制

js的預解析機制


預解析,就是js會將變數宣告和函式宣告提到當前作用域的最前方
(提升時,應該是 變數宣告在前,函式宣告在後,這樣就可以解釋,衝突的時候,是函式有效—第三條)
在碰到script標籤,js開始預解析,將全域性的用 var 宣告的變數和函式的宣告提升到 當前作用域最前面
之後就順序執行,之後遇到區域性的,再同理處理

  1. 只能預解析var宣告的變數,沒有用var宣告的變數(隱式全域性變數)不會被預解析
  2. 函式宣告中的沒有用var宣告而直接賦值的變數,只有在函式呼叫之後才會生效,成為隱式全域性變數
  3. 在函式名和var變數名衝突的時候,預解析會捨棄var變數的宣告(原因也是後來者有效)
  4. 函式名和函式名衝突的時候,(宣告)後來者有效
  5. 預解析是分標籤的
  6. 在使用函式表示式的時候,提升的是var變數,而不是函式宣告
  7. 在變數賦值後,同名的函式名失效,無法呼叫函式
  8. 提升只限當前作用域
/*
* 預解析,就是js會將變數宣告和函式宣告提到當前作用域的最前方
* 在碰到<script>標籤,js開始預解析,將全域性的用 var 宣告的變數和函式的宣告提升到最前面
* 之後就順序執行,之後遇到區域性的,再同理處理
* 1. 只能預解析var宣告的變數,沒有用var宣告的變數(隱式全域性變數)不會被預解析
* 2. 函式宣告中的沒有用var宣告而直接幅值的變數,只有在函式呼叫之後才會生效,成為隱式全域性變數
* 3. 在函式名和var變數名衝突的時候,預解析會捨棄var變數的宣告
* 4. 函式名和函式名衝突的時候,(宣告)後來者有效
* 5. 預解析是分標籤的
* 6. 在使用函式表示式的時候,提升的是var變數,而不是函式宣告
* 7. 在變數賦值後,同名的函式名失效,無法呼叫函式
* 8. 提升只限當前作用域
* */
console.log(a());//3 99
console.log(a);//ƒ a() {// 函式呼叫後,隱式全域性變數生效 b = 2;console.log(3);return 99;}

var a = 10;
a = function (){
    console.log(33);
}
console.log(a());//33 undefined

// 不會被呼叫
function a() {
    b = 1;
    console.log(2);
    return 88;
}
console.log(b);//2
console.log(a);//ƒ (){console.log(33);}

function a() {
    // 函式呼叫後,隱式全域性變數生效
    b = 2;
    console.log(3);
    return 99;
}
// b = 3;

var a = 11;
console.log(a);//11