Javascript 为什么this=>不将“this”绑定到周围的范围?

Javascript 为什么this=>不将“this”绑定到周围的范围?,javascript,node.js,ecmascript-6,Javascript,Node.js,Ecmascript 6,我从MDN获取了以下内容 x = 9 var module = { x: 81, getX: () => this.x } var getX = module.getX console.log(getX()) 我得到9分: 这不应该被其词法范围和输出81所限制吗?而下面的原始答案是正确的,v8不保证-ES6箭头有词法范围-这意味着它被限制到周围的范围。对象文字不是作用域 如果您有如下代码: var obj = {}; obj.x = 5; obj.foo = () =&

我从MDN获取了以下内容

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

var getX = module.getX 
console.log(getX())
我得到9分:


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

而下面的原始答案是正确的,v8不保证-ES6箭头有词法范围-这意味着它被限制到周围的范围。对象文字不是作用域

如果您有如下代码:

var obj = {};
obj.x = 5;
obj.foo = () => this.x;
obj.foo();
箭头函数有词法,这恰恰意味着你不会得到5,而是从周围的范围得到一些东西。这不同于基于调用者对象确定的常规动态

原件: 因为v8有一个错误的arrow函数实现,它在作用域方面还不能正常工作。这就是为什么它首先在一面旗帜后面


您可以跟踪进度。同时,您可以使用像BabelJS这样的transpiler作为构建步骤,直到有了功能为止。

虽然下面的原始答案是正确的,而且v8没有任何保证-ES6箭头中有这一点-这意味着这是绑定到周围范围的。对象文字不是作用域

如果您有如下代码:

var obj = {};
obj.x = 5;
obj.foo = () => this.x;
obj.foo();
箭头函数有词法,这恰恰意味着你不会得到5,而是从周围的范围得到一些东西。这不同于基于调用者对象确定的常规动态

原件: 因为v8有一个错误的arrow函数实现,它在作用域方面还不能正常工作。这就是为什么它首先在一面旗帜后面

您可以跟踪进度。同时,您可以使用像BabelJS这样的transpiler作为构建步骤,直到功能出现。

因为arrow函数的内部绑定到外部,所以:

var x=9; 变量模块={ x:81, getX:=>this.x/`this`仍然是'window',无法更改 }; var getX=module.getX; module.getX;//9 getX.callmodule;//9 getX.callwindow;//9 getX;//9 这与普通函数不同,普通函数不绑定:

var x=9; 变量模块={ x:81, getX:函数{ //像'module.getX'一样调用时,'this'是'module'` //当在非严格模式下像“getX”一样调用时,“this”是“window” //'this'在严格模式下像'getX'一样调用时是'undefined' //`this`可以使用`call`、`apply`、`bind`进行更改` 归还这个.x; } }; var getX=module.getX; module.getX;//81 getX.callmodule;//81 getX.callwindow;//9 getX;//9非严格模式或错误严格模式 因为箭头函数的内部绑定到外部,所以:

var x=9; 变量模块={ x:81, getX:=>this.x/`this`仍然是'window',无法更改 }; var getX=module.getX; module.getX;//9 getX.callmodule;//9 getX.callwindow;//9 getX;//9 这与普通函数不同,普通函数不绑定:

var x=9; 变量模块={ x:81, getX:函数{ //像'module.getX'一样调用时,'this'是'module'` //当在非严格模式下像“getX”一样调用时,“this”是“window” //'this'在严格模式下像'getX'一样调用时是'undefined' //`this`可以使用`call`、`apply`、`bind`进行更改` 归还这个.x; } }; var getX=module.getX; module.getX;//81 getX.callmodule;//81 getX.callwindow;//9 getX;//9非严格模式或错误严格模式 当使用=>运算符时,您显式使用的是this-other模块…这不应该受其词法范围的限制[…]这正是此处发生的情况。当使用=>运算符时,您显式使用的是this-other模块…这不应该受其词法范围的限制[…]这正是此处发生的情况。