在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