参考文章
总结
什么是块作用域{ }
ECMAScript 6(简称ES6)中新增了块级作用域。块作用域由 { } 包括,if语句和for语句里面的{ }也属于块作用域。
没有let const 块作用域之前有什么问题
- 在if或者for循环中声明的变量会泄露成全局变量
for(var i=0;i<=5;i++){
console.log("hello");
}
console.log(i); //5
- 内层变量可能会覆盖外层变量
var temp = new Date();
function f(){
console.log(temp);
if(false){
var temp = "hello";
}
}
f(); //undefined
不管最后是否执行if语句,都会输出undefined,因为temp会提升到函数顶部,因此覆盖了外部的变量temp。
var、let、const的区别
- var定义的变量,没有块的概念,可以跨块访问, 不能跨函数访问,有变量提升。
- let定义的变量,只能在块作用域里访问,不能跨块访问,也不能跨函数访问,无变量提升,不可以重复声明。
- const用来定义常量,使用时必须初始化(即必须赋值),只能在块作用域里访问,而且不能修改,无变量提升,不可以重复声明。注意:const常量,指的是常量对应的内存地址不得改变,而不是对应的值不得改变,所有把应用类型的数据设置为常量,其内部的值是可以改变的,例如:const a={}; a.b=13;//不会报错 const arr=[]; arr.push(123);//不会报错
立即执行函数
在ES5中,因为没有块级作用域,获得广泛运用的是立即执行函数。现在ES6增加了块级作用域,那么立即执行函数就不再必要了。ES6以前变量的作用域是函数范围,有时在函数内局部需要一些临时变量,因为没有块级作用域,所以就会将局部代码封装到IIEF(立即执行函数)中,这样达到了想要的效果又不引入多余的临时变量。而块作用域引入后,IIEF当然就不必要了!临时变量被封装在IIFE中,就不会污染上层函数;而有块级作用域,就不用封装成IIEF,直接放到一个块级中就好。更简单的说法是,立即执行匿名函数的目的是建立一个块级作用域,那么现在已经有了真正的块级作用域,所以立即执行匿名函数就不需要了。