当然,这将返回您期望的结果:

["A","B","C"].map(function (x) {
    return x.toLowerCase();
});
// --> ["a", "b", "c"]

使用String.prototype.toLowerCase.call也是如此:
["A","B","C"].map(function (x) {
    return String.prototype.toLowerCase.call(x);
});
// --> ["a", "b", "c"]

如果传递map给出的额外参数,它也会起作用,因为它会丢弃参数:
["A","B","C"].map(function (x, index, arr) {
    return String.prototype.toLowerCase.call(x, index, arr);
});
// --> ["a", "b", "c"]

但是,这不起作用:
["A","B","C"].map(String.prototype.toLowerCase.call);
// --> TypeError: undefined is not a function

以下内容也不起作用,因为arguments具有Object原型(prototype)而不是Array原型(prototype),因此slice在其上未定义。发生上述行为的原因可能是因为这样的事情-在内部使用slice或其他类似的Array函数吗?
["A","B","C"].map(function (x) {
    return String.prototype.toLowerCase.apply(x, arguments.slice(1));
});
// --> TypeError: undefined is not a function

最佳答案

这是JavaScript点表示法的特殊行为。
toLowerCase.call(x)之所以有效,是因为JavaScript在执行toLowerCase时使用this作为call。这就是call(与您在每个函数上找到的Function.prototype.call相同)如何知道要其执行toLowerCase的方式。

call传递到另一个函数会丢失该引用,因此this不再引用toLowerCase

10-07 14:34