JS中變量會預解析,所謂的預解析就是:在當前作用域中,JavaScript代碼執行之前,瀏覽器首先會默認的把所有帶var和function聲明的變量進行提前的聲明或者定義。
編譯前:
console.log(a); var a = 3;
編譯后可看做:
var a; // 將變量a的聲明提升至最頂端,賦值邏輯不提升。 console.log(a); // undefined a = 3; // 代碼執行到原位置即執行原賦值邏輯
一、變量聲明的提升是以變量所處的第一層詞法作用域為“單位”的,即全局作用域中聲明的變量會提升至全局最頂層,函數內聲明的變量只會提升至該函數作用域最頂層。
編譯前:
console.log(a); var a = "a"; var foo = () => { console.log(a); var a = "a1"; } foo()
編譯后可看做:
var a; console.log(a); // undefined a = "a"; var foo = () => { var a; // 全局變量會被局部作用域中的同名變量覆蓋 console.log(a); // undefined a = "a1"; }
二、函數聲明的優先級高於變量聲明。
三、函數提升只會提升函數聲明,而不會提升函數表達式。
編譯前:
console.log(foo1); foo1(); console.log(foo2); foo2(); function foo1() { console.log("foo1"); }; var foo2 = function () { console.log("foo2"); }
編譯后可看做:
function foo1() { console.log("foo1"); }; var foo2; console.log(foo1);// [Function: foo1] foo1(); // foo1 console.log(foo2); // undefined foo2(); // TypeError: foo2 is not a function foo2 = function () { console.log("foo2"); }