将function.prototype.call生成的函数作为参数传递时,Array.prototype.map不是函数
Array.prototype.map is not a function when passing a function generated by Function.prototype.call as argument
有时我使用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);
有人能向我解释一下为什么我会得到一个错误,上面写着:吗
未捕获类型错误:["a","b","c","d"].map不是函数
第一个问题是传递函数''.toUpperCase.apply
,该函数与Function.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));
那么您会遇到第二个问题:map
不会只向回调传递一个参数。它还传递索引和整个数组。
你可以用"修复"这两个问题
['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
时,尽管它会正确地传递参数,但call
函数与toUpperCase
函数分离,后者保存了实现细节。
因此,现在Function.call
确实有Array.map
回调函数传递给它的正确参数,但它没有引用''.toUpperCase
函数。
MDN:调用现有对象时,可以分配不同的
this
对象作用this
是指当前对象,是调用对象。
因此,''.toUpperCase.call("a")
与call("a")
完全不同,这就是当您将''.toUpperCase.call
传递给Array.map
相关文章:
- 直接在函数声明上使用function.prototype.bind
- 如何迭代Array.prototype函数
- 如何通过 Function.prototype.apply() 更改调用函数的参数
- 如何将参数应用于String.prototype.format函数
- "可变变量可从闭包“”访问;在传递给Array.prototype.every的函数中
- JavaScript继承构造函数.prototype
- Prototype.js 1.7:将collect与显式函数一起使用会返回与内联函数不同的结果,原因是什么
- JavaScript 的 Array 调用和函数在 Prototype 中失败
- node.js 使用 function.prototype.apply 执行的泛型函数
- 在节点 0.11 中使用 ES6 箭头函数,w/ foo.prototype
- Object.Prototype 方法和 IIFE(立即调用的函数表达式)中的“use strict”
- 为什么更改函数的 .prototype 会影响已使用该构造函数创建的对象的“实例”
- 模拟“类”时,为什么要在 .prototype 属性中设置方法,而不是在构造函数本身中设置方法
- HTML5 Canvas:通过 Image.prototype 创建一个 Image.onload() 函数
- 可从作为参数传递给 Event.observe() (prototype.js) 的函数中访问的变量.为什么
- 仅返回数组数据,而不返回使用 Array.prototype 的函数本身
- 调用带有挂起的 Parens 与 Function.prototype.call 的函数表达式
- JavaScript'有Ruby等价物吗;s函数.prototype.bind
- Javascript-Prototype没有读取构造函数变量
- 如何将附加到Object的函数移动到Object.prototype