为什么不是这个=>将“这”限制在周围范围内?

时间:2015-03-30 15:21:09

标签: javascript node.js ecmascript-6

我从MDN那里获得了以下code

x = 9  
var module = {
  x: 81,
  getX: () => this.x
} 

var getX = module.getX 
console.log(getX())

我得到9

alex@alex-K43U:~/node/es6$ iojs --harmony_arrow_functions index.js
9

不应该this限制其词法范围和输出81吗?

2 个答案:

答案 0 :(得分:6)

虽然以下原始答案是正确的,而v8不做任何保证 - ES6箭头有词汇 this - 这意味着this绑定到周围范围。您的对象文字不是范围。

如果您有以下代码:

var obj = {};
obj.x = 5;
obj.foo = () => this.x;
obj.foo();

具有词汇this的箭头函数正好意味着你不会得到5回来,而是从周围的范围获得一些东西。这与基于调用者对象确定的常规动态不同。


原件: 因为v8有一个错误的箭头函数实现,并且它在范围方面仍然无法正常工作。这就是为什么它首先落在旗帜之后。

您可以跟踪进度here in the issue tracker。与此同时,您可以使用像BabelJS这样的转换程序作为构建步骤,直到功能存在。

答案 1 :(得分:2)

因为箭头函数中的this绑定到外部this

var x = 9;
var module = {
    x: 81,
    getX: () => this.x // `this` is still `window`, and can't be changed
};
var getX = module.getX;
module.getX();     // 9
getX.call(module); // 9
getX.call(window); // 9
getX();            // 9

这与普通函数不同,后者不绑定this

var x = 9;
var module = {
  x: 81,
  getX: function() {
    // `this` is `module` when called like `module.getX()`
    // `this` is `window` when called like `getX()` in non-strict mode
    // `this` is `undefined` when called like `getX()` in strict mode
    // `this` can be changed using `call`, `apply`, `bind`
    return this.x;
  }
};
var getX = module.getX;
module.getX();     // 81
getX.call(module); // 81
getX.call(window); // 9
getX();            // 9 (non-strict mode) or error (strict mode)