JS變量提升和函數提升


  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");
}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM