如何从闭包中访问方法?
How can I access a method from a closure?
寻求有关在闭包函数中修改对象的问题的一些指导。
我正在 Angular 5 中重写一个程序。我的程序使用商店来管理表单向导,其中一些问题使用 svg elements/buttons 来回答。单击后,将设置一个对象 属性。下面的代码是我遇到问题的框架版本。
我读过其他闭包 post,但没有遇到适合我的情况的闭包。
感谢回答 and/or 重构建议。
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)
}
}
}
更新为原版post
我想我需要为可能 运行 解决此问题的其他人在我的问题中添加更多信息。我提供的代码是我整体代码的骨架。
在测试之前,我确实使用 ()={} 箭头符号(以不同的组合)重构了 function() 调用,但这并没有解决问题,因为它进一步破坏了需要 (this).element 的方法作为结果button.click().
这里的一种方法是将 this
作为参数传递,例如
((function(that){
button.click(function(){
that.object.car = 'red';
console.log(that.object.car);
});
})(this),false) // <-- pass 'this' here
并且使用保留 this
的箭头函数,你可以做这样的事情
console.log(this.object.car); // 'blue' to console
button.click(() => {
this.object.car = 'red';
console.log(this.object.car);
});
感谢大家的评论和提交的答案。我想声明@LGson 提供的答案是可靠的并且有效。但我觉得我需要稍微清理一下这个 post 并分享我为解决这个问题所做的工作,我的情况使用 canvas 框架来生成依赖于 ( this) 在 button.click() 事件中的元素上以及我无法访问外部对象的地方。
下面是我如何让它工作的。
- 我把外层函数改成了箭头符号格式就走了
问题中所述的 button.click() 调用。
- 我为 self 添加了一个指向我需要的对象的变量
访问。
我在对象中添加了一个getter方法给return的值
需要内部参考并使用 self.car 和 self.getter 来设置
并检索我需要的值。和库方法
继续按预期工作。
class Builder {
object:any;
constructor(){
this.object = {
car:'blue',
get value():{ return this.car;}
}
}
init(){
var self = this.object;
_.forEach(database, (o)=>{
console.log(this.object.car); // 'blue' to console
((()=>{
button.click(function(){
self.car = 'red';
console.log(self.value); // red
});
})(),false)
}
}
}
寻求有关在闭包函数中修改对象的问题的一些指导。 我正在 Angular 5 中重写一个程序。我的程序使用商店来管理表单向导,其中一些问题使用 svg elements/buttons 来回答。单击后,将设置一个对象 属性。下面的代码是我遇到问题的框架版本。
我读过其他闭包 post,但没有遇到适合我的情况的闭包。
感谢回答 and/or 重构建议。
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)
}
}
}
更新为原版post
我想我需要为可能 运行 解决此问题的其他人在我的问题中添加更多信息。我提供的代码是我整体代码的骨架。
在测试之前,我确实使用 ()={} 箭头符号(以不同的组合)重构了 function() 调用,但这并没有解决问题,因为它进一步破坏了需要 (this).element 的方法作为结果button.click().
这里的一种方法是将 this
作为参数传递,例如
((function(that){
button.click(function(){
that.object.car = 'red';
console.log(that.object.car);
});
})(this),false) // <-- pass 'this' here
并且使用保留 this
的箭头函数,你可以做这样的事情
console.log(this.object.car); // 'blue' to console
button.click(() => {
this.object.car = 'red';
console.log(this.object.car);
});
感谢大家的评论和提交的答案。我想声明@LGson 提供的答案是可靠的并且有效。但我觉得我需要稍微清理一下这个 post 并分享我为解决这个问题所做的工作,我的情况使用 canvas 框架来生成依赖于 ( this) 在 button.click() 事件中的元素上以及我无法访问外部对象的地方。
下面是我如何让它工作的。
- 我把外层函数改成了箭头符号格式就走了 问题中所述的 button.click() 调用。
- 我为 self 添加了一个指向我需要的对象的变量 访问。
我在对象中添加了一个getter方法给return的值 需要内部参考并使用 self.car 和 self.getter 来设置 并检索我需要的值。和库方法 继续按预期工作。
class Builder { object:any; constructor(){ this.object = { car:'blue', get value():{ return this.car;} } } init(){ var self = this.object; _.forEach(database, (o)=>{ console.log(this.object.car); // 'blue' to console ((()=>{ button.click(function(){ self.car = 'red'; console.log(self.value); // red }); })(),false)
} } }