假设我有以下代码:
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代码。谢谢!!!
答案 0 :(得分:6)
这是因为您要传递给this
的函数的函数上下文(forEach()
)现在为window
,而不再是您的Test
实例。 / p>
如果改为使用箭头功能,则可以保留 lexical-scope ,并且您的this
指向当前(Test
)实例:
Object.keys(this.obj).forEach((name, index) =>
{
alert(this.obj[name])
});
请参见MDN
答案 1 :(得分:4)
HomeFragment
引用了函数的当前上下文,因此在您的示例中,HomeFragment
在MainFragment
回调的上下文中查找this
。您可以通过保留对当前上下文的引用来解决此问题,即this.obj
或改用箭头功能。
老方法:在此解决方案中,我们在变量obj
forEach
首选或速记解决方案:通过使用箭头功能
this
答案 2 :(得分:4)
经典的Java范围课程。
有两种方法可以做到这一点:
使用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])
})
}
答案 3 :(得分:1)
匿名函数未绑定到上下文,因此它们无权访问this
;但是箭头功能是。因此,请改用它。
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()