Javascript 将function.prototype.call生成的函数作为参数传递时,Array.prototype.map不是函数
有时我使用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(); }); /
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
感谢您的回答阿米特