ES6 自我总结 一、let和const玩透了吗

105 阅读2分钟

配置文件

.babelrc

presets字段设定转码规则,官方提供以下的规则集,你可以根据需要安装。

然后,将这些规则加入 .babelrc

命令行转码babel-cli

let

es6中6种声明方法:

varfunction

ES6除了添加letconst命令,另外两种声明变量的方法:import命令和class命令。

ES6中新增的 let 和 const 以及 class ,在全局声明的变量不再作为全局对象的属性

为什么需要块级作用域

一、内层变量可能会覆盖外层变量。

二、用来计数的循环变量泄露为全局变量。

函数声明

ES5规定

函数只能在顶层作用域函数作用域之中声明,不能块级作用域声明

浏览器没有遵守这个规定

还是支持在块级作用域之中声明函数,不过,“严格模式” 下还是会 报错

也就是说!ES5就是不让在除了函数作用域外的{}花括号内做函数声明的。

ES6规定

明确允许在块级作用域之中声明函数。

块级作用域之中函数声明语句的行为类似于let

也就是说,花括号{}外的地方无法引用内部声明的函数

但是这里为什么会返回f 是 Undefined 呢? 执行到console.log(f)的时候,不应该是返回外部的f函数(下图)吗?

而且不是应该执行f() 打印 I am outside吗?

这是因为 为了减轻不兼容问题,es6允许浏览器自己的行为方式

实际上运行的是


也就是说,现在es5有一套函数声明的条件,es6有一套,es6的浏览器还有一套,是不是很乱呢?

我们现在来捋一下:

1.es5 中 正常的顶级作用域和函数作用域都可以函数声明,但是其他的如同if和 try的块级作用域都不允许函数声明,但是浏览器并不想报错。

2.es6 中 允许了在所有块级作用域中函数声明,并且函数声明行为类似let一样在函数声明的块级作用域中才可以引用(也就是if(){如果你在这里做了函数声明})

3.浏览器支持es6后又不想报es5中的错,

考虑到环境导致的行为差异太大,应该避免在块级作用域内声明函数。如果确实需要,也应该写成函数表达式,而不是函数声明语句。