Javascript 将function.prototype.call生成的函数作为参数传递时,Array.prototype.map不是函数

Javascript 将function.prototype.call生成的函数作为参数传递时,Array.prototype.map不是函数,javascript,arrays,Javascript,Arrays,有时我使用Array.prototype.map方法,如下所示: var array = ['1', '2', '3', '4'].map(parseFloat); // the result is [1, 2, 3, 4] parseInt接受2个参数,在本例中返回不正确的值 现在我要做的不是这个代码: var array = ['a', 'b', 'c', 'd'].map( function (item) { return item.toUpperCase(); }); /

有时我使用Array.prototype.map方法,如下所示:

var array = ['1', '2', '3', '4'].map(parseFloat); // the result is [1, 2, 3, 4]
parseInt接受2个参数,在本例中返回不正确的值

现在我要做的不是这个代码:

var  array = ['a', 'b', 'c', 'd'].map( function (item) { 
    return item.toUpperCase(); 
}); // the result is ['A', B', 'C', 'D']
我试过这个:

var array = ['a', 'b', 'c', 'd'].map(''.toUpperCase.call);
有人能解释一下为什么我会出现这样的错误:

未捕获的TypeError:[“a”、“b”、“c”、“d”]。映射不是函数


第一个问题是传递函数
'.toUpperCase.apply
,该函数与
函数.prototype.apply
相同:它没有绑定

发生的事情相当于

['a', 'b', 'c', 'd'].map(function(v, i, arr){
   return undefined.apply(v, i, arr)
});
如果您使用

['a', 'b', 'c', 'd'].map(''.toUpperCase.apply.bind(''.toUpperCase));
然后还有第二个问题:不能只向回调传递一个参数。它还传递索引和整个数组

您可以使用“修复”这两个问题

['a', 'b', 'c', 'd'].map(function(v){ return ''.toUpperCase.apply(v) });
(与其说是修复,不如说是解释,对吧)

使用
call
更容易,而且可以修复:

var arr = ['a', 'b', 'c', 'd'].map(''.toUpperCase.call.bind(''.toUpperCase));
应该写为

var arr = ['a', 'b', 'c', 'd'].map(Function.prototype.call.bind(''.toUpperCase));
旁注:您很幸运在第一个示例中使用了
parseFloat
。尝试使用
parseInt

当您将
''.toUpperCase.call
传递到
Array.map
时,尽管它将正确传递参数,
调用
函数将从保存实现细节的
toUpperCase
函数分解

因此,现在
函数.call
确实有
数组.map
回调函数传递给它的正确参数,但它不包含对
'.toUpperCase
函数的引用

调用现有对象时,可以为该对象指定不同的

功能
引用当前对象,调用对象


因此
'.toUpperCase.call(“a”)
call(“a”)
完全不同,这是当您将
'.toUpperCase.call
传递到
数组.map

…时发生的情况,此时您可以简单地使用
返回v.toUpperCase()
是的,我发现使用
''.toUpperCase.apply
时会出现问题,但为什么使用
'.toUpperCase.call
时会出现问题,即使您可以传递任意多的参数,结果总是正确的谢谢你的回答DenysWhy使用
''.toUpperCase
而不是
String.prototype.toUpperCase
?对我来说,感觉就像使用
(函数(){})一样.call
而不是
函数.prototype.call
为了更好地理解为什么这不起作用,我建议阅读。我将它与
数组.prototype.map
相结合,它将每个元素的值作为参数传递给give函数,在本例中,give函数是
”。toUpperCase.call
感谢您的回答阿米特