在es2015以前JavaScript並無塊級做用域這個說法,只有全局和函數級的變量,let的出現使JavaScript語言有了塊級做用域函數
{ var a=5; let b=10; } console.log(a,b);//a=5 b=undefined
{ var a=5; let b=10; { console.log(a,b);//a=5 b=12 } }
for(var i=0; i<5; i++){}; console.log(i)//i=5 for(var i=0; i<5; i++){}; console.log(i)//i=undefined
使用var聲明的變量會提高,而使用let聲明的變量不會提高spa
function f(){ console.log(a); var a=5; /*等價於 var a; console.log(a); a=5;*/ } f()//a=undefined function f(){ console.log(a); let a=5; } f()//a is not defined
var config = (function(){ var config = []; config.push(1); config.push(2); config.push(3); return config; })(); let config; { config = []; config.push(1); config.push(2); config.push(3); }
function a(){console.log(1);} function f(){ a(); if(false){ function a(){console.log(2)} } } //這段代碼在非嚴格模式下運行會打印出2,在嚴格模式下運行會打印出1
var arr= []; function f(){ for(var i=0; i<5; i++){ arr.push(function(){ console.log(i); }) } } f(); arr[3]()//5 arr[4]()//5 arr[1]()//5
想要執行出想要的結果arr[x]()//x就必須用到letcode
var arr= []; function f(){ for(let i=0; i<5; i++){ arr.push(function(){ console.log(i); }) } } f(); arr[3]()//3 arr[4]()//4 arr[1]()//1
在es2015以前您必須這樣作blog
var arr= []; function f(){ for(var i=0; i<5; i++){ arr.push((function(i){ return function(){ console.log(i); } })(i)) } } f(); arr[3]()//3 arr[4]()//4 arr[1]()//1