es2015之前
在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声明的变量不会提升
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); }
在严格模式(use strict)下运行函数不会被提升
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就必须用到let
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之前您必须这样做
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