24

我在我的类方法之一中使用 forEach 遍历数组。我需要访问 forEach 中的类的实例,但这未定义的。

var aGlobalVar = {};

(function () {

    "use strict";

  aGlobalVar.thing = function() {
      this.value = "thing";   
  }

  aGlobalVar.thing.prototype.amethod = function() {
      data.forEach(function(d) {
      console.log(d);
      console.log(this.value);
  });
}
})();

var rr = new aGlobalVar.thing();
rr.amethod(); 

我有一个我在这里工作的小提琴:http: //jsfiddle.net/NhdDS/1/

4

3 回答 3

54

在严格模式下,如果您不是通过属性引用调用函数并且没有指定this应该是什么,它就是undefined.

forEach( spec | MDN ) 允许您说出this应该是什么,这是您传递给它的(可选的)第二个参数:

aGlobalVar.thing.prototype.amethod = function() {
  data.forEach(function(d) {
    console.log(d);
    console.log(this.value);
  }, this);
  // ^^^^
}

或者,箭头函数在 2015 年被添加到 JavaScript。由于箭头关闭this,我们可以使用一个:

aGlobalVar.thing.prototype.amethod = function() {
  data.forEach(d => {
    console.log(d);
    console.log(this.value);
  });
}
于 2013-10-18T09:03:27.740 回答
6

由于您使用的是严格模式,因此当调用不是对象属性的函数时,默认情况下this将具有该值undefined(而不是全局对象)。您应该手动存储其值:

var aGlobalVar = {};

(function () {
    "use strict";

    aGlobalVar.thing = function () {
        this.value = "thing";   
    };

    aGlobalVar.thing.prototype.amethod = function () {
        var self = this;
        data.forEach(function (element) {
          console.log(element);
          console.log(self.value);
        });
    };
})();

var rr = new aGlobalVar.thing();
rr.amethod();

如今,在 ES2015 中,您还可以使用箭头函数,它使用this外部函数的值:

function foo() {
  let bar = (a, b) => {
    return this;
  };

  return bar();
}

foo.call(Math); // Math

forEach如果您不喜欢临时变量的想法,TJ Crowder 的使用第二个参数的解决方案也可以很好地工作(ES5 代码:现在几乎可以在任何浏览器中使用,除了 IE8-)。

于 2013-10-18T09:03:20.287 回答
0

我必须this在我正在使用的每个 forEach 中添加(请参阅https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/forEach)。不需要在构造函数中绑定,因为我使用的是箭头函数。所以现在我的代码是:

resetPressed = () => {
    this.transport_options.forEach(function (transport_option) {
        this.pressed_percentages.forEach(function (percentage) {
            filters[transport_option][percentage] = false;
        }, this)
    }, this);

    filters.isFilterActive = false;
    this.setState({
        filtersState: filters,
        opacity: filters.isFilterActive ? 1 : 0.5
    });

}


<TouchableHighlight
    underlayColor={'transparent'}
    onPress={this.resetPressed}
    style={styles.iconView}>
于 2020-01-27T20:19:36.467 回答