this 在异步对象方法中
this inside an async object method
我创建了一个使用 babel-polyfill/babel-preset-es2017 异步函数方法的对象,但是 this
:
我遇到了问题
let obj = () => {
return {
doAsync: async () => {
let thing = await longProcess()
return this.transform(thing)
},
transform: (thing) => {
return psuedoCodeTransform(thing)
}
}
}
let instance = obj()
instance.doAsync()
// TypeError: cannot read property 'transform' of undefined`.
这是 ES2017 中描述的内容吗,一个 babel-polyfill/regeneratorRuntime 陷阱?
Arrow functions do not create their own context。他们没有自己的 this
并且 this
将引用封闭范围的上下文。在这种情况下(没有双关语意),this
根本不指代与 instance
相同的对象。
如果您在 doAsync
中记录 this
,您会注意到它是 window
全局的。
Joseph the Dreamer 的回答显然是完全正确的,但由于我以身作则,因此您的代码已更改,应该可以正常工作。请注意,唯一的变化实际上是将 doAsync
定义为普通函数而不是箭头函数:
let obj = () => {
return {
doAsync: async function() {
let thing = await longProcess()
return this.transform(thing)
},
transform: (thing) => {
return psuedoCodeTransform(thing)
}
}
}
let instance = obj()
instance.doAsync()
// TypeError: cannot read property 'transform' of undefined`.
我创建了一个使用 babel-polyfill/babel-preset-es2017 异步函数方法的对象,但是 this
:
let obj = () => {
return {
doAsync: async () => {
let thing = await longProcess()
return this.transform(thing)
},
transform: (thing) => {
return psuedoCodeTransform(thing)
}
}
}
let instance = obj()
instance.doAsync()
// TypeError: cannot read property 'transform' of undefined`.
这是 ES2017 中描述的内容吗,一个 babel-polyfill/regeneratorRuntime 陷阱?
Arrow functions do not create their own context。他们没有自己的 this
并且 this
将引用封闭范围的上下文。在这种情况下(没有双关语意),this
根本不指代与 instance
相同的对象。
如果您在 doAsync
中记录 this
,您会注意到它是 window
全局的。
Joseph the Dreamer 的回答显然是完全正确的,但由于我以身作则,因此您的代码已更改,应该可以正常工作。请注意,唯一的变化实际上是将 doAsync
定义为普通函数而不是箭头函数:
let obj = () => {
return {
doAsync: async function() {
let thing = await longProcess()
return this.transform(thing)
},
transform: (thing) => {
return psuedoCodeTransform(thing)
}
}
}
let instance = obj()
instance.doAsync()
// TypeError: cannot read property 'transform' of undefined`.