console.log(a);
var a = 10
複製代碼
a = undefined
console.log(a); // undefined
a = 10;
複製代碼
console.log(b);
console.log(c);
function b() {
console.log("b");
}
var c = function() {
console.log("c");
}
複製代碼
function b() {
console.log("b");
}
c = undefined;
console.log(b); // function b() { console.log("b") }
console.log(c); // undefined
c = function() {
console.log("c");
}
複製代碼
咱們記住兩點 在預解析階段 有函數提高和變量提高兩個動做。javascript
(functino(){
console.log(a); // undefined
var a = 10;
})()
function start(){
console.log(b); // function b() { console.log("b") }
console.log(c); // undefined
function b() {
console.log("b");
}
var c = function() {
console.log("c");
}
}
start();
複製代碼
變量提高發生在當前的函數做用域內。 自執行函數和函數都有提高過程。java
(function(){
b = 10;
})()
console.log(b);
複製代碼
(function(){
b = 10;
})()
console.log(b); // 10
複製代碼
沒有聲明的變量b在解析階段並無提高,js執行器在發現b沒有在當前做用域聲明時會在執行階段提高到全局。因此外面能夠訪問到 。 若是在執行階段提早打印b會直接報錯中止運行。bash
5.1 例1異步
(function(){
console.log(b);
var b = 10;
function b(){
console.log("fn");
}
console.log(b);
})()
複製代碼
(function(){
function b(){
console.log("fn");
}
console.log(b); // function b(){console.log("fn"); }
b = 10;
console.log(b); // 10
})()
複製代碼
當函數生命和var聲明同時存在的時候 函數聲明優先級高 這個要注意函數
5.2 例2spa
function start(b){
start = 10;
console.log(start);
console.log(b);
b = 10;
}
start();
console.log(b);
複製代碼
function start(){
b = undefined;
start = 10;
console.log(start); // function start(b){ ... }
console.log(b); // undefined
b = 10;
}
start();
console.log(b); // err b is not defined
複製代碼
在函數內部有參數時 b 就會聲明在函數內部。 而給函數名自己賦值是無效的。code
還有更多js的解析過程須要你們發現。例如異步代碼。setTimeout Promise 等等執行過程 這裏列舉在函數解析過程中的常見問題。好比 let const 就沒有提高過程。ip