Javascript 上下文“this”不保留在对象方法中

Javascript 上下文“this”不保留在对象方法中,javascript,ecmascript-6,Javascript,Ecmascript 6,我认为ECMA6中的方法定义可能是错误的,它在内部使用了箭头函数,必须保留此上下文。 但是 它引发错误Uncaught TypeError:无法读取未定义的属性“methodOne” 所以,要么我理解的规范不正确,要么浏览器Chrome、FF和nodejs还不支持这一点?ES6中的类只是语法上的糖分,而不是原型继承。这样,类中的方法声明将附加到原型对象 1示例中的问题在于调用函数的方式。要保持此上下文,您仍然需要将其作为对象上的方法调用: 2但如果您将其作为常规函数调用,则在严格模式下将其视为未

我认为ECMA6中的方法定义可能是错误的,它在内部使用了箭头函数,必须保留此上下文。 但是

它引发错误Uncaught TypeError:无法读取未定义的属性“methodOne”


所以,要么我理解的规范不正确,要么浏览器Chrome、FF和nodejs还不支持这一点?

ES6中的类只是语法上的糖分,而不是原型继承。这样,类中的方法声明将附加到原型对象

1示例中的问题在于调用函数的方式。要保持此上下文,您仍然需要将其作为对象上的方法调用:

2但如果您将其作为常规函数调用,则在严格模式下将其视为未定义:

 methodTwo() {
        console.log("MethodTwo is called");
        this.methodOne(); // <---- `this` is `undefined`
 }
函数调用中的这一点由调用方式决定:

as regular函数使其在非严格模式下成为未定义或全局对象:someMethod;或var m=foo.methodTwo;M 作为对象上的一个方法,它将成为对象:foo.methodTwo 由于构造函数使其成为新创建的对象:newfoo 使用applynewContext和callnewContext的间接调用:someMethod.applycontext。 请注意,绑定方法可以在调用之前修改上下文。它将在调用案例1、2和4时取消任何以后的上下文修改。对于构造函数调用,绑定上下文将被忽略,并且仍然使用新创建的对象

检查JavaScript中的函数上下文和调用

所以,要么我理解的规范不正确,要么浏览器Chrome、FF和nodejs还不支持这一点

无论您阅读规范的哪一部分,您都会误解它。方法和箭头函数是两种不同的东西,即使方法具有箭头函数语义,您也不会得到您期望的行为,因为箭头函数在词汇上解决了这个问题

不,方法的工作方式与正常函数声明符/表达式类似


另请参见

在后一种情况下,它不是全局对象而不是未定义的吗?@RemcoGerlich在严格模式下未定义,在非严格全局对象中未定义。@dmitravlutin如果您将其称为foo.method,您是如何得到未定义的?@您没有调用foo.method,您只是引用函数对象。后来这个对象作为常规函数调用,而这个函数是未定义的。与foo.method相反:对foo对象的方法调用。@dmitravlutin在常规函数下是什么意思?类似于方法的东西?规范中哪里说类似于内部使用箭头函数的东西,或者必须保留“此”上下文?为什么ES6会改变呢?箭头函数和方法定义是两码事。你是对的。我又读了一遍说明书,它让我明白了。
var foo = new Foo();

var executing = function (someMethod, context) {someMethod.apply(context)};

executing(foo.methodTwo, context);
 methodTwo() {
        console.log("MethodTwo is called");
        this.methodOne(); // <---- `this` is `undefined`
 }