我想要一个对象和一个函数数组并返回一个数组。我正在尝试在这里使用for循环。
我在下面有以下代码:
const fnArr = [
function firstName() {
return this.first;
},
function lastName() {
return this.last;
},
];
const obj = { first: 'Nimit', last: 'Maru' };
function callAll(obj, fnArr){
let newArray = [];
for (let i=0; i<fnArr.length; i++){
let eachFunc = fnArr[i];
return newArray.push(eachFunc.call(obj))
}
}
callAll(obj, fnArr)
我的预期输出是:
['Nimit', 'Maru']
但是我个人代码的输出返回:1
问题1:我在这里做错了什么?
///////////////////////////////////////////////// ///////////////////////////////////////////////////// //////////
另外,给我的解决方案如下:
const fnArr = [
function firstName() {
return this.first;
},
function lastName() {
return this.last;
},
];
const obj = { first: 'Nimit', last: 'Maru' };
const callAll = (obj, fnArr) => {
return fnArr.map(fn => {
return fn.call(obj);
});
};
它会产生正确的答案。
问题2:在上面的解决方案代码中,为什么在“ return fn.call(obj)”中需要调用方法?
在这种情况下何时需要或不需要呼叫的概念性解释将不胜感激。
答案 0 :(得分:2)
您将在每个循环中返回。因此,在第一个循环之后,该函数结束并且代码不再执行。
它返回1
,因为push()
方法在向数组添加元素后返回了数组的长度。最初添加1个元素后,数组为空,它将返回1
。
您不必仅使用map()
元素(不返回)即可使用push()
。并在循环后返回newArray
。
const fnArr = [
function firstName() {
return this.first;
},
function lastName() {
return this.last;
},
];
const obj = { first: 'Nimit', last: 'Maru' };
function callAll(obj, fnArr){
let newArray = [];
for (let i=0; i<fnArr.length; i++){
let eachFunc = fnArr[i];
newArray.push(eachFunc.call(obj))
}
return newArray
}
console.log(callAll(obj, fnArr))
在上面的解决方案代码中,为什么在“ return fn.call(obj)”中需要调用方法?
此对函数的绑定取决于函数的调用方式。如果将该函数称为对象的方法,则该对象将绑定到该方法。
在上面的代码this
中,如果两个函数正常调用,则两个函数将refer
到window
对象。所以我们希望this
引用对象,所以我们使用call
为什么eachFunc(obj)返回[undefined,undefined]?
当您不使用call
时,this
将引用window
对象。因此,first
对象上没有名为last
和window
的属性,因此它返回undefined