js的預解析機制
阿新 • • 發佈:2018-12-02
js的預解析機制
預解析,就是js會將變數宣告和函式宣告提到當前作用域的最前方
(提升時,應該是 變數宣告在前,函式宣告在後,這樣就可以解釋,衝突的時候,是函式有效—第三條)
在碰到script標籤,js開始預解析,將全域性的用 var 宣告的變數和函式的宣告提升到 當前作用域最前面
之後就順序執行,之後遇到區域性的,再同理處理
- 只能預解析var宣告的變數,沒有用var宣告的變數(隱式全域性變數)不會被預解析
- 函式宣告中的沒有用var宣告而直接賦值的變數,只有在函式呼叫之後才會生效,成為隱式全域性變數
- 在函式名和var變數名衝突的時候,預解析會捨棄var變數的宣告(原因也是後來者有效)
- 函式名和函式名衝突的時候,(宣告)後來者有效
- 預解析是分標籤的
- 在使用函式表示式的時候,提升的是var變數,而不是函式宣告
- 在變數賦值後,同名的函式名失效,無法呼叫函式
- 提升只限當前作用域
/* * 預解析,就是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