假设我有以下代码:
class Test {
constructor(obj) {
this.obj = obj
}
change() {
Object.keys(this.obj).forEach(function(name, index) {
alert(this.obj[name])
})
}
}
objct = {
n1: 1,
n2: 2
}
var test = new Test(objct)
test.change()
但是,当我运行此命令时,我得到以下错误:
未捕获TypeError:无法读取未定义的属性'obj‘
我认为这意味着this
在对象键函数中是未定义的。如何访问对象键和forloop中的this.obj
?
根据这个answer,我可以使用map
,但我还需要属性名称和forloop中的数组index
。这是代码的fiddle,如果它对你有帮助的话。谢谢!
发布于 2019-03-18 01:43:04
这是因为您传递给forEach()
的函数的函数上下文( this
)现在是window
,它不再是您的Test
实例。
Object.keys(this.obj).forEach((name, index) =>
{
alert(this.obj[name])
});
请参阅MDN
发布于 2019-03-18 01:44:08
this
引用函数的当前上下文,因此在您的示例中,this.obj
在forEach
回调的上下文中查找obj
。您可以通过保留对当前上下文的引用(即this
)或使用箭头函数来解决此问题。
OLD WAY:在这个解决方案中,我们在变量self
中保留了对当前上下文的引用
class Test {
constructor(obj){
this.obj = obj
}
change() {
var self = this
Object.keys(this.obj).forEach(function (name, index) {
alert(self.obj[name])
})
}
}
objct = {
n1: 1,
n2: 2
}
var test = new Test(objct)
test.change()
首选或速记解决方案:通过使用箭头函数
class Test {
constructor(obj){
this.obj = obj
}
change() {
Object.keys(this.obj).forEach((name, index) => {
alert(this.obj[name])
})
}
}
objct = {
n1: 1,
n2:2
}
var test = new Test(objct)
test.change()
发布于 2019-03-18 01:48:55
Javascript中的经典作用域课程。
有两种方法可以完成此操作:
使用bind()
将forEach的作用域绑定到父函数
change() {
Object.keys(this.obj).forEach(function(name, index) {
alert(this.obj[name])
}.bind(this))
}
使用=>
,这是将forEach的作用域绑定到父函数的另一种方式
change() {
Object.keys(this.obj).forEach((name, index) => {
alert(this.obj[name])
})
}
https://stackoverflow.com/questions/55209965
复制相似问题