javascript中宣告提升
阿新 • • 發佈:2019-02-13
在javascript中,通過var , function 宣告的變數或者函式,在編譯時是可以提升的;
而對於ES6中,通過let,const宣告的變數是不能提升的。
變數的宣告提升與函式的宣告提升是有點區別的。
(1) var 宣告變數的提升(不論是否為嚴格模式,也不論是否是在if{}等程式碼塊中宣告,都是可以提升的,var a;)
(function test(){ 'use strict'; alert(a);// undefined if(false){ alert(a);//undefined var a=1; } alert(a);//undefined })();
等效於
(function test(){
'use strict';
var a;
alert(a);// undefined
if(false){
alert(a);//undefined
a=1;
}
alert(a);//undefined
})();
(2) function 宣告的函式,提升考慮到是否為嚴格模式,是否在if{}程式碼塊中宣告
function parent(){ if{ ....... function child(){} ....... } } 嚴格模式:(在嚴格模式下,child的作用範圍僅僅是if{}塊,在if{}外邊訪問不到)
function parent(){ child //ReferenceError : child is not defined if{ function child(){} //child 宣告提前到if{}塊前 ....... } } 非嚴格模式:(在非嚴格模式下,child的作用範圍是整個function函式,不是if{}程式碼塊) function parent(){ var child //undefined; child();//ReferenceError : child is not a function if{ function child(){} //child 宣告提前到if{}塊前 ....... } }
例子:
//非嚴格模式
(function test(){
alert(a);// undefined
alert(a());//ReferenceError:a is not function
if(false){
alert(a());//1
function a() {return 1;};
}
alert(a);//undefined
alert(a());//ReferenceError:a is not function
})();
等效於:
(function test(){
var a;//僅僅變數a宣告提前
alert(a);// undefined
alert(a());//ReferenceError:a is not function
if(false){ //在非嚴格模式下,變數a的作用域範圍是整個函式,不是在if{}塊內部;但是函式a的作用於範圍僅僅在if{}塊中
function a() {return 1};//函式宣告僅僅提升到if{}程式碼塊頂部
alert(a());//1
}
alert(a);//undefined
alert(a());//ReferenceError:a is not function
})();
//在嚴格模式下,a的作用範圍僅僅是if{}塊,在if{}外邊訪問不到
(function test(){
'use strict';
alert(a);// ReferenceError:a is not defined
alert(a());//ReferenceError:a is not defined
if(false){ //a 的作用範圍僅僅是在if{}塊中,函式宣告也僅僅提升到if{}塊頂端
alert(a());//1
function a() {return 1;};
}
alert(a);//ReferenceError:a is not defined
alert(a());//ReferenceError:a is not defined
})();
等效於:
(function test(){
'use strict';
alert(a);// ReferenceError:a is not defined
alert(a());//ReferenceError:a is not defined
if(false){ //a 的作用範圍僅僅是在if{}塊中,函式宣告也僅僅提升到if{}塊頂端
function a() {return 1;};
alert(a());//1
}
alert(a);//ReferenceError:a is not defined
alert(a());//ReferenceError:a is not defined
})();