在es6中新增let 跟const在定义一个块级作用域,在es5中用var声明变量,但他的缺点比较多,最明显的就是存在变量提升,同一个变量可以多次声明,后声明的会覆盖之前声明的
另外
!function(){
var a=b=5;
}()
console.log(a);
console.log(b);
再此程序中会发现,a is not defined,b=5 为什么呢,是因为a是声明在函数内部的,所属作用域在函数体内是局部变量,b是全局变量,相当于var b;function(){ b=5;var a=b }
当循环和闭包在一起的时候就要特别注意了
for(var i=1;i<=5;i++){
setTimeout(function timer(){
console.log(i);
},1000);
}
按常规说是每隔一秒输出一个数1,2.。。5;事实上会每次都输出6,因为定时器会被浏览器带入一个等待队列中,所以是等for循环完之后在执行定时器,所以每次打印都是6;如何解决这个问题,一下列出几种方法
for(var i=0;i<=5;i++){
(function(j){
setInterval(function timer(){
console.log(j);
},1000)
})(i);
}
for(let i=0;i<=5;i++){
....
}
两种解决方式es6直接用let定义块级作用域即可,es5通过自执行函数传入参数实现