Javascript 为什么this=>不将“this”绑定到周围的范围?
我从MDN获取了以下内容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 = () =&
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模块…这不应该受其词法范围的限制[…]这正是此处发生的情况。