【发布时间】:2018-11-21 02:02:26
【问题描述】:
寻求一些关于在闭包函数中修改对象的问题的指导。 我正在用 Angular 5 重写一个程序。我的程序使用商店来管理表单向导,其中一些问题使用 svg 元素/按钮来回答。单击后,将设置对象属性。下面的代码是我遇到的问题的骨架版本。
我已阅读其他关闭帖子,但没有遇到适合我的情况的帖子。
感谢您提供重构的答案和/或建议。
class Builder {
object:any;
constructor(){
this.object = {
car:'blue'
}
}
init(){
//Short cutting to click commands.. Using lodash
_.forEach(database, (o)=>{
console.log(this.object.car); // 'blue' to console
((function(){
button.click(function(){
this.object.car = 'red';
console.log(this.object.car); //Cannot read property
'object' of undefined
});
})(),false)
}
}
}
更新原帖
我认为我需要在我的问题中为可能遇到此问题的其他人添加更多信息。我提供的代码是我整个代码的骨架。
在测试之前,我确实使用 ()={} 箭头符号(以不同的组合)重构了 function() 调用,但这并没有解决问题,因为它进一步破坏了需要 (this).element 的方法,因为button.click().
【问题讨论】:
-
你的错误对我来说看起来很奇怪。如果之前的赋值不抛出,
this怎么会是未定义的呢? -
@ASDFGerte,也许 OP 假设
Cannot read property 'object' of undefined来自console.log(this.object.car);行,而它实际上来自this.object.car = 'red';,因为很可能这条线会抛出同样的错误。 -
要保留对
this的引用,您可以将每次出现的function() {...}替换为箭头函数() => {...}。 -
@lealceldeiro 虽然两者都会抛出 TypeError 并且规范似乎没有说明所述错误的消息应该是什么,但这是可能的。但是,chrome、FF 和 node 都显示了可区分这些情况的正确消息,这使得他显示的错误极不可能来自该代码(连同声明,唯一可能引发此错误的其他地方应该记录“蓝色")。
标签: javascript angular closures store