你需要知道的在使用var時的作用範圍

var作用範圍

var關鍵字的特性

var關鍵字有個特性,在js預處理階段會進行作用提升,即無論聲明在使用語句的前還是後,都會提升到最前面,但注意:僅僅只是聲明提升了,賦值並沒有,所以在賦值前訪問會得到undefined

console.log(a);
var a=1;

作用提升的時候,var除了腳本和函數體都會穿透,所以容易產生一些奇怪的錯誤

var a=[];
for(var i=0;i<3;i++){
	setTimeout(()=>{console.log(i)},1000);
}

此時會打印出3個3,究其原因就是for循環結束,在執行回調函數時,每個回調函數訪問的都是同一個i,且i=3
在看一個例子:

var a=1;
function foo(){
	console.log(a);
	if(false){
		var a=2;
	}
}
foo();

分析該例子,很容易根據上面的知識知道,函數體內部無法穿透所以 a=2 不會覆蓋 a=1,同時作用提升到函數體最前面。在執行階段:函數體內輸出a時由於函數體內部存在a的聲明,所以不會訪問外部a,但是賦值在調用後,所以此時輸出undefined

在實際開發中,建議使用let來取代var,let只在當前作用域內有效,且不會進行作用提升!!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章