Javascript forEach return" undefined"作为对象变量

时间:2016-10-21 00:08:04

标签: javascript arrays foreach

我尝试实现对forEach的简单调用,以对汽车数组中的所有项目运行logMe函数。输出是意外的。读取所有变量"未定义。"



    function Automobile(year, make, model, type) {
      this.year = year;
      this.make = make;
      this.model = model;
      this.type = type;
    }

    Automobile.prototype.logMe = function(boolVal) {
      if (boolVal == true) {
        console.log(this.year + ' ' + this.make + ' ' + this.model + ' ' + this.type);
      } else {
        console.log(this.year + ' ' + this.make + ' ' + this.model);
      }
    }

    var automobiles = [
      new Automobile(2010, "Toyota", "Tacoma", "Pickup"),
      new Automobile(2005, "Lotus", "Elise", "Roadster"),
      new Automobile(2008, "Subaru", "Outback", "Wagon")
    ];

    automobiles.forEach(Automobile.prototype.logMe.bind(true)); //the problem
    automobiles[0].logMe(true); //test logMe function




输出:

undefined undefined undefined

undefined undefined undefined

undefined undefined undefined

1995年本田雅阁轿车

2 个答案:

答案 0 :(得分:2)

Function.bind()的第一个参数是函数中this的值。在您的示例中,this绑定到true,这就是您获取undefined属性值的原因。

forEach会将元素作为回调的第一个参数传递。因此,您可以定义一个在其第一个参数上调用logMe的lambda,而不是传递绑定方法。

automobiles.forEach(function(car, i, cars) {car.logMe(true);});

答案 1 :(得分:1)

Function.prototype.bind 创建一个新函数,您必须传入 this 的值 - 调用该函数的构造。

如果你想创建一个可以在这之后调用的函数数组,你应该像下面这样使用bind,否则只需调用forEach中的函数。

var caller = [];
automobiles.forEach(function(element) {
  caller.push(Automobile.prototype.logMe.bind(element));
}, caller);
caller[0](true);

演示如下:



function Automobile(year, make, model, type) {
  this.year = year;
  this.make = make;
  this.model = model;
  this.type = type;
}

Automobile.prototype.logMe = function(boolVal) {
  if (boolVal == true) {
    console.log(this.year + ' ' + this.make + ' ' + this.model + ' ' + this.type);
  } else {
    console.log(this.year + ' ' + this.make + ' ' + this.model);
  }
}

var automobiles = [
  new Automobile(2010, "Toyota", "Tacoma", "Pickup"),
  new Automobile(2005, "Lotus", "Elise", "Roadster"),
  new Automobile(2008, "Subaru", "Outback", "Wagon")
];

var caller = [];

automobiles.forEach(function(element) {
  caller.push(Automobile.prototype.logMe.bind(element));
}, caller);

caller[0](true); //test logMe function