使用 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 ,这三点也是要注意的。