前言,趁着休假,准备把阮老师的ES6入门再看一遍,梳理下知识点,加强理解。
let和const
- let与var,都是声明变量的,但是let声明的变量只在对应的代码块内有效
- for循环中的计数很适合用let
- for循环还有一个特殊之处,就是循环变量部分是个父级作用域,循环体内是个单独的作用域
for (let i=0;i<2;i++) {
let i= "abc";
console.log(i)
}
// "abc"
// "abc"
- let声明的变量不存在变量提升,即在未声明之前不可使用
- 暂时性死区TDZ,在块级作用域内,只要使用了let const声明变量,那么在声明语句之前使用这些变量都会报错
- 暂时性死区说明typeof将不是一个百分之百安全的操作
- 不允许在相同的作用域内,重复声明同一个变量,因此,也不能在函数内部重新声明参数
function func(arg){
let arg;
}
func() //报错
function func(arg){
{
let arg;
}
}
func() //不报错
- 块级作用域,ES5只有全局作用域和函数作用域,块级作用域的出现解决两个问题:
内部变量覆盖外部变量
var tmp = "hello"
function func(){
console.log(tmp);
if(false){
var tmp = "world";
}
}
func() //undefined 由于变量提升,内部变量覆盖了外部变量
解决循环计数变量泄露为全局变量
- 块级作用域的出现,使得立即执行匿名函数不再必要了
- ES5规定只能在顶层作用域以及函数作用域内部声明函数,ES6打破了这一约束,但是在块级作用域内部声明函数,请采用函数表达式,尽量不要在块级作用域内部声明函数
- const声明的是只读常量,一旦声明,常量的值不能改变,不存在变量提升,但是存在暂时性死区
- const声明一个引用类型的值,其实是保证了指向数据的指针地址不改变,但是数据就没法保证了
- ES6一共有6种声明变量的方法,另一方面规定,let命令、const命令、class命令声明的全局变量,不属于顶层对象的属性。也就是说,从ES6开始,全局变量将逐步与顶层对象的属性脱钩。
----未完待续