配置文件
.babelrc
presets字段设定转码规则,官方提供以下的规则集,你可以根据需要安装。
然后,将这些规则加入 .babelrc。
命令行转码babel-cli
let
es6中6种声明方法:
var和function。
ES6除了添加let和const命令,另外两种声明变量的方法: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中的错,
考虑到环境导致的行为差异太大,应该避免在块级作用域内声明函数。如果确实需要,也应该写成函数表达式,而不是函数声明语句。