我尝试实现对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年本田雅阁轿车
答案 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