如何从闭包中访问方法?

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() 事件中的元素上以及我无法访问外部对象的地方。

下面是我如何让它工作的。

  1. 我把外层函数改成了箭头符号格式就走了 问题中所述的 button.click() 调用。
  2. 我为 self 添加了一个指向我需要的对象的变量 访问。
  3. 我在对象中添加了一个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)
    

    } } }