Skip to content
返回

ES6 中的隐形“坑”

使用 ES6(借助了 Babel 的力量)写代码已经很长时间了,中间碰到了几个坑,记录一下。

Promise 中的未捕获错误

下面的代码会报错,因为里面的 x 未定义:

new Promise( resolve => resolve( x + 1 ) ).then( ()=> console.log( '一切正常' ) );

不过按照标准,浏览器不会给出任何错误提示,因为错误会被传递到 catch() 回调里。上面的代码没有注册这个回调,所以结果就是浏览器没有任何反应:既不会打印 log,也不会报错。

之前我使用的是 jakearchibald/es6-promise,它严格遵循标准,我花了很长时间都不知道为什么 Promise 没执行到 then 里面去,换成了 Babel 的 browser-polyfill.js 才知道 Promise 里面产生了未捕获的错误。Babel 同时也会提示产生了未处理的 rejection,好贴心 :)

箭头函数里的 this

const t = {
  name:'mk',
  yes() { console.log(this.name); },
  no:() =>  console.log( this.name )
};

t.yes(); // 打印出 mk
t.no(); // 报错

箭头函数里的 this 指向它外围的那个 this,上面的代码中,yes() 方法里的 this 指向 t,但 no() 方法里的 this 指向全局对象,而由于 babel 默认使用严格模式,this 会被替换为 undefined,所以会报错。

除了 this 以外,箭头函数不能被当做构造函数、不能使用 arguments 对象、不能用 yield ,这三点也是要注意的。


分享这篇文章:

上一篇
该不该用 NPM 替代 Bower?
下一篇
改用 WebStorm 编译 es6 与 scss 文件