http://es6.ruanyifeng.com/#docs/let(官方文档)
let命令:
let命令:声明变量作用域为let命令所在{ }
上述代码 let声明的a只在{ }内部生效,var声明的 b则是全局变量
上述代码中let声明的i只在 循环体内部有效;
用for循环声明函数存放在数组中,a[i]的作用是输出i的值,因为var声明的i是全局变量,全局只有一个i,每循环一次i的值就会加1,console.log(i)中的i指向的是全局变量i;
在上述代码中for循环设置(let i=0;i<3;i++)的作用域和循环体内部处于不同的作用域,不会发生干扰。
不存在变量提升:
var命令会发生”变量提升“现象,即变量可以在声明之前使用,值为undefined。
let命令声明的变量一定要在声明之后使用,否则就会报错。
暂时性死区
暂时性死区(temporal dead zone,简称 TDZ):在代码块内部也就是{ }中,它所声明的变量就绑定在这个区域之中,!不受外部影响!,也就是说,在使用let命令声明变量之前,该变量是不可用的
在上述代码中,代码块中的{ }内部声明一个局部变量tmp,导致局部变量tmp绑定在这个块级作用域中,且不受外部var声明的全局变量tmp的影响,因此声明之前使用了变量,导致出现报错。
上诉代码中,在let命令声明tmp之前,都属于tmp的死区,
上述代码由于在let声明x变量之前(x变量的死区中)使用x变量,所以报错
上述代码中,由于未用let声明undeclared_varible所以不存在该变量的死区,所以不会报错。
比较隐蔽的死区:
上述代码中把参数x默认等于另一个参数y,而此时y还未被声明(我认为:x=y ,y=2相当于在默认情况下 letx=y let y=2;)属于死区。 如果如下图所示代码,就不存在死区,是可以输出的
另外:下面代码也会报错:
上面代码之所以会报错也是因为死区,let x=x意思是把x的值赋给(变量未声明时使用该变量,出现“死区”)let声明的x的变量。
总之,暂时性死区的本质就是,只要一进入当前作用域,所要使用的变量就已经存在了,但是不可获取,只有等到声明变量的那一行代码出现,才可以获取和使用该变量。
不允许重复声明:
let不允许在相同作用域内,重复声明同一个变量
块级作用域:
ES5 只有全局作用域和函数作用域,没有块级作用域,这带来很多不合理的场景
第一种场景,内层变量可能会覆盖外层变量。
if(false){ }意思是永不执行,也就是在调试代码的时候用用,之所以会输出undefined是因为javaScript 中,函数及变量的声明都将被提升到函数的最顶部,此段代实际执行的代码为
第二种场景:用来计数的循环变量泄露为全局变量。
ES6的块级作用域:{ }
函数的作用域与函数声明:
ES6 引入了块级作用域,明确允许在块级作用域之中声明函数。ES6 规定,块级作用域之中,函数声明语句的行为类似于let,在块级作用域之外不可引用。
ES6:
1.允许在块级作用域内声明函数。
2.函数声明类似于var,即会提升到全局作用域或函数作用域的头部。
3.同时,函数声明还会提升到所在的块级作用域的头部。
注意,上面三条规则只对 ES6 的浏览器实现有效,其他环境的实现不用遵守,还是将块级作用域的函数声明当作let处理。
考虑到环境导致的行为差异太大,应该避免在块级作用域内声明函数。如果确实需要,也应该写成函数表达式,而不是函数声明语句。
if判断如果不写{ } 的话 意为 :条件判断成功之后只执行if判断的下一条语句。
网友评论