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只在當前作用域內有效,且不會進行作用提升!!