有人可以向我解释为什么我无法正确使用字符串数组的apply方法吗?
function speak(line) {
console.log(line);
}
var whiteRabbit = {type: "white", speak: speak};
speak.apply(whiteRabbit, ["Burp!","Skree","Hello"]);
输出为Burp
,为什么不是整个数组呢?以及如何使用apply方法实现这一目标?
答案 0 :(得分:1)
Function#apply将数组扩展为函数参数,因为您的唯一参数是line
,数组中的第一项被分配给它,其余项被忽略。
顺便说一句 - 由于speak
函数无法以任何方式使用this
,apply
的第一个参数并不重要在这种情况下。
如果您要为该功能添加更多参数,您可以看到它的工作原理:
function speak(a, b, c) {
console.log(a, b, c);
}
speak.apply(null, ["Burp!","Skree","Hello"]);

如果需要显示未知长度的数组,最好使用Function#call调用该函数,然后迭代数组,或将其转换为可呈现的内容。例如:
function speak(arr) {
console.log(arr.join(' '));
}
speak.call(null, ["Burp!", "Skree", "Hello", "Cats"]);

答案 1 :(得分:1)
apply()
方法调用具有给定this
值的函数,并将arguments
作为数组(或array-like object)提供。
您只将数组的第一个元素作为参数line
。如果您使用更多参数,您也可以看到数组的其余部分。
function speak(line, line1, line2) {
console.log(line);
console.log(line1);
console.log(line2);
}
var whiteRabbit = {
type: "white",
speak: speak
};
speak.apply(whiteRabbit, ["Burp!", "Skree", "Hello"]);

如果您希望将值用作数组,则可以使用arguments
并迭代值。
function speak() {
Array.prototype.forEach.call(arguments, function (s) {
console.log(s);
});
}
var whiteRabbit = {
type: "white",
speak: speak
};
speak.apply(whiteRabbit, ["Burp!", "Skree", "Hello"]);

Wit ES6你可以使用rest parameters ...
function speak(...args) {
args.forEach(s => console.log(s));
}
var whiteRabbit = {
type: "white",
speak: speak
};
speak.apply(whiteRabbit, ["Burp!", "Skree", "Hello"]);

答案 2 :(得分:0)
我将假设fatRabbit
应该是whiteRabbit
,而您的问题就是为什么您只看到Burp!
而不是完整数组。
原因是apply
使用数组通过离散参数调用您的函数,因此第一个条目显示为line
参数,而您不是看到其他人,因为你没有参数。
如果您想查看数组,请使用call
而不是apply
;然后line
将引用数组,而不仅仅是第一个条目:
function speak(line) {
console.log(line);
}
var whiteRabbit = {type: "white", speak: speak};
speak.call(whiteRabbit, ["Burp!","Skree","Hello"]);
或者,在方法中添加更多参数(speak(line1, line2, line3)
)。
在评论中,你问过:
你能说明如何让它变得动态吗?
如果通过“动态”表示它会记录尽可能多的条目,我会使用call
(如上所述)和循环:
function speak(lines) {
lines.forEach(function(line) {
console.log(line);
});
}
var whiteRabbit = {type: "white", speak: speak};
speak.call(whiteRabbit, ["Burp!","Skree","Hello"]);
使用forEach
,但you have lots of other options。
答案 3 :(得分:0)
您需要添加更多参数
function speak(line, line2, line3) {
console.log(line, line2, line3);
}
var whiteRabbit = {type: "white", speak: speak};
speak.apply(whiteRabbit, ["Burp!","Skree","Hello"]);
答案 4 :(得分:0)
你可以让兔子一个接一个地说:
["Burp!","Skree","Hello"].forEach( speak );
如果您也想更改上下文:
["Burp!","Skree","Hello"].forEach( word => speak.call(rabbit, word));