1、ES6的块级作用域是什么样的?
很多编程语言都有块级作用域的概念,如今ES6也终于有了。
if( condition ){
type variable = value;
}
在if条件外以任何形式访问variable都会报错,只在当前的if块级作用域内才有效,这就是块级作用域。
ES6之前,
for(var i = 0; i < len; i ++){
//
}
console.log(i); //有效
如今引入let、const后
for(let i = 0; i < len; i ++){
//
}
console.log(i); //error
和我们熟知的C/C++ ,Java等不一样的是。只有关键字let、const声明的变量才是块级作用域变量(注意,const也是块级作用域声明关键字,并且它声明的是常量)。
2、 ES6的let和const和var的区别
除了用let和const声明的变量是块级作用域变量(常量)以外,它们还有一个特点,就是有TDZ(临时死区):
①let和const的不可提升特性
我们先来看用var声明的变量
console.log(variable); //undefined
var variable = value;
尽管在声明它之前就访问,但是并没有报错,这是因为用var声明的变量等价于:
var variable;
console.log(variable);
variable = vaule;
再来看let(const类似)
console.log(variable); //出错
let variable = value;
也就是说,只有在用let声明之后,才可以访问, 而且就算使用比较安全的typeof来访问此变量,依然会出错。
并且和var还有一点不一样的是,在for循环中,每次循环let/cont都会重新声明
for(var i; //) //仅仅声明一次
for(let i; //) //每次循环都会再次声明
而且,for(let i),i的作用域是在for的小括号当中的,{}中的i是通过闭包访问的,理解这一点很重要。
②不可覆盖
用var声明的变量可以多次声明,依次被覆盖。该let和const如果重复声明则会报错。
③全局变量
用var声明的去全局变量,会自动挂载到window对象上(浏览器端),但是let和const的全局声明则不会挂载到window对象上。
所以let/const 不会覆盖window的属性,只会遮蔽它。