let和var區別: 1 for(var i=0;i<5;i++){ 2 setTimeout(()=>{ 3 console.log(i);//5個5 4 },100) 5 } 6 console.log(i);//5 7 console.log(' ') 8 9 for(let j=0;j<5; ...
let和var區別:
1 for(var i=0;i<5;i++){ 2 setTimeout(()=>{ 3 console.log(i);//5個5 4 },100) 5 } 6 console.log(i);//5 7 console.log('=============') 8 9 for(let j=0;j<5;j++){ 10 setTimeout(()=>{ 11 console.log(j);//0,1,2,3,4 12 },100) 13 } 14 console.log(j);//報錯 j is not defined
為什麼 用let就可以顯示正確結果,而var就不可以呢?
var是全局作用域,有變數提升的作用,所以在for中定義一個變數,全局可以使用,迴圈中的每一次給變數i賦值都是給全局變數i賦值。
let是塊級作用域,只能在代碼塊中起作用,在js中一個{}中的語句我們也稱為叫一個代碼塊,每次迴圈會產生一個代碼塊,每個代碼塊中的都是一個新的變數j;
es6中不是說let聲明變數不能重覆聲明嗎?看下邊例子:
{ let a=123; }
{ let a=246; } console.log(a);//a is not defined; { var b=1; } { var b=2; } console.log(b);// 2;
{}代表一個塊,這個時候let聲明的變數只在這個塊中起作用,而這個塊對var聲明的變數不起作用。因為var是全局作用域。
let a=1; let a=2; //Uncaught SyntaxError: Identifier 'a' has already been declared //let不能重覆聲明 let b=1; var b=2; // Uncaught SyntaxError: Identifier 'a' has already been declared //let不能重覆聲明 var c=3; var c=4; console.log(c)//4;var可以重覆聲明