我相信(可能是我错了)ECMA6的方法定义使用箭头功能(内部)和"这个" (背景)必须保留。 但
class Foo {
methodOne() {
console.log("MethodOne is called")
}
methodTwo() {
console.log("MethodTwo is called");
this.methodOne();
}
}
var foo = new Foo();
var executing = function (someMethod) {someMethod()};
executing(foo.methodTwo)
它引发了错误" Uncaught TypeError:无法读取属性' methodOne'未定义的(...)"
那么,要么我理解规格不正确,要么浏览器(Chrome,FF)和nodejs不支持这个?
答案 0 :(得分:3)
ES6中的类只是原型继承的语法糖。这样,类中的方法声明将附加到prototype
对象。
1)示例中的问题在于调用函数的方式。要保留上下文this
,您仍需要将其作为对象上的方法调用:
var foo = new Foo();
var executing = function (someMethod, context) {someMethod.apply(context)};
executing(foo.methodTwo, context);
2)但是如果您将其作为常规功能调用,那么您将在严格模式下将其设为undefined
:
methodTwo() {
console.log("MethodTwo is called");
this.methodOne(); // <---- `this` is `undefined`
}
函数调用中的 this
由其调用方式决定:
this
设为undefined
或非严格模式下的全局对象):someMethod();
或var m = foo.methodTwo; m();
this
成为对象):foo.methodTwo()
this
成为新创建的对象):new Foo()
apply(newContext)
和call(newContext)
):someMethod.apply(context)
。请注意bound()
方法可以在调用之前修改上下文。对于情况1,2和4,它将取消对调用的任何后续上下文修改。对于构造函数调用,将忽略绑定上下文并仍使用新创建的对象。
在JavaScript中检查this nice post有关函数上下文和调用的信息。
答案 1 :(得分:1)
那么,要么我理解规格不正确,要么浏览器(Chrome,FF)和nodejs不支持这个?
无论你阅读哪个规范,你都误解了它。方法和箭头函数是两个不同的东西,即使方法具有箭头函数语义,你也不会得到你期望的行为(因为箭头函数在词法上解析this
)。
不,方法像普通函数声明/表达式一样工作到this
。
另见How to access the correct `this` context inside a callback?