ES6箭头功能在V8中有词汇

时间:2015-01-19 16:42:04

标签: javascript this v8 ecmascript-6 lexical-scope

我使用胖箭头函数有以下ES6代码:

var test = {
  firstname: 'David',
  fn: function() {
    return ['one', 'two', 'tree'].map(() => this.firstname)
  }
}
console.log(test.fn())

根据箭头函数的工作原理,我希望this成为test对象。 ES6Fiddle,Traceur和Firefox产生的预期输出为["David", "David", "David"]

但是,当使用chrome://flags/#enable-javascript-harmony在Chrome中启用这些功能时,我会获得[undefined, undefined, undefined]。如果您console.log(this)它显示它是窗口对象,并且您在严格模式下出错。 ES6箭头函数的词法this是否尚未在V8中实现?

2 个答案:

答案 0 :(得分:11)

Lexical this是ES6箭头函数的最后一部分,它将落在第8版中,这就是为什么它仍然在旗帜后面并且尚未准备好发货的原因。 Igalia的阿德里安·佩雷斯(Adrian Perez)正在实施箭头功能,一旦完成一些TurboFan问题,最终补丁几乎准备就绪:https://codereview.chromium.org/883823002/

答案 1 :(得分:1)

胖箭是ES6的一个特色。它已在Firefox(Gecko)中引入,但尚未在其他浏览器中引入(尤其不完全在V8中,这对于nodejs / iojs开发很有意义。)这是一个参考文档

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Functions/Arrow_functions#Browser_compatibility

无论如何如果您需要范围绑定,则使用=>代替bind()。这是一个简单的例子。

而不是这个。

$("#example").on("click", () => {
   // your code goes here
});

使用此功能。

$("#example").on("click", (function() {
   // your code goes here
}).bind(this));

如果您不需要范围绑定,那么就这样做。

$("#example").on("click", function() {
   console.log("example");
});