在 _.filter 中访问 this.var?

access to this.var in _.filter?

我有一个变量 this.myvar,它是一个数组。我想用这个变量创建一个 _.filter(),但是在 _.filter() 函数中我的 this.myvar 是未知的。

有没有办法解决这个问题,还是我完全误解了什么?

this.my_array = ['aaa', 'bbb', 'ccc', 'ddd'];
this.my_filter = ['aaa', 'ccc'];

my_filtered_object = _.filter(this.my_array, function(item) {           
    alert(this.my_filter.toSource());   
    /*          
    if(this.my_filter.indexOf(item) != -1) {
                return item;
    }
    */
});

警报应显示 this.my_filter 的值,但似乎 _.filter() 内无法访问该变量

有多种解决方案。

  1. 将引用存储在单独的变量中:

    var my_filter = this.my_filter;
    my_filtered_object = _.filter(this.my_array, function(item) {           
      alert(my_filter.toSource());   
    });
    
  2. 设置_.filter()内的上下文(this)指向函数外的this:

    my_filtered_object = _.filter(this.my_array, function(item) {           
      alert(this.my_filter.toSource());   
    }, this);
    
  3. 使用 arrow function expression(尽管这可能不适用于所有浏览器):

    my_filtered_object = _.filter(this.my_array, item => {
      alert(this.my_filter.toSource());
    });
    
  4. 使用 _.bind(),正如马里奥在他的回答中所建议的那样。

解决方案 #2 对我来说最有意义。

如果您想访问 [=24],您传递给 _.filter() 的匿名函数需要绑定到您的上下文=].

使用下划线你只需要改变你的代码如下:

my_filtered_object = _.filter(this.my_array, _.bind(function(item) {           
    alert(this.my_filter.toSource());   
    /*          
    if(this.my_filter.indexOf(item) != -1) {
                return item;
    }
    */
}, this));

如您所见,我添加了 _.bind() 方法,将您需要的上下文附加到匿名函数。