1. 程式人生 > >javascript中宣告提升

javascript中宣告提升

在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
})();