變量提升和函數提升:
就是將變量聲明或者函數全部代碼提升到當前作用域(全局作用域或函數作用域)最開始的部分。
JavaScript中函數域為最小域范圍;for循環、while循環、if語句、switch語句的“{}”不是作用域。
一.變量提升:
使用var聲明的變量,會提前到當前作用域的開始的位置,被聲明。原位賦值。
1.所指的形式:var a = "提升";(必須有關鍵字“var”)
2.提升的方式:將“var a”,提升到當前作用域的頂部,a = "提升",在原型定義的位置。
3.具體代碼:
eg:
1. console.log( a) ----> undefined
var a = 10;
console.log(a) ----> 10
2.console.log(a);
var a = "我是全局中的變量";
console.log(a);
function fn(){
console.log(interiorA);
var interiorA = "我是函數內的變量";
console.log(interiorA)
}
fn();
↓↓↓↓↓↓↓↓
變量提升執行順序
var a ; //變量提升,此時只是聲明,並沒有賦值
console.log(a); // undefined
a = "我是全局中的變量" // 此時才賦值
console.log(a); //我是全局中的變量
function fn() {
var interiorA; //變量提升,函數作用域范圍內
console.log(interiorA); //undefined
interiorA = "我是函數內的變量" //此時對局部變量進行賦值
console.log(interiorA) //我是函數內的變量
}
二.函數提升
1.函數提升所指的形式:function fn(){......}(必須是函數聲明的形式,不能是函數表達式的形式)。
2.函數提升的方式:將“function fn(){......}”整個函數聲明代碼塊提升到當前作用域的頂部,
原先位置以不存在該代碼。
3.所有使用function聲明的函數,都會整體提升,只要當前作用域內聲明了數
在任何位置都可以使用,賦值式創建函數,提升的聲明,不是。
當函數和變量重名,變量的提升更高,函數的提升在變量的下面,
導致值函數生效
var a;
function a(){}
console.log(a);
a = 10;
eg:
function fn(){
console.log(a);
var a = "hello";
console,log(a);
function a(){1}
console.log(a);
a = "world";
console.log(a);
function a(){2}
cosole.log(a)
}
上式提升后等同於下式
function fn(){
var a; 變量提升最高;
function a(){1}; 函數提升到變量下面;
function a(){2};
console.log(a); f2
a = "hello"
console.log(a); hello
console.log(a); hello
a = "world"
console.log(a) world
console.log(a) world
}