是否可以使用对某些函数的call属性的引用,并将其作为值传递?

时间:2018-10-24 21:21:24

标签: javascript function functional-programming first-class-functions

这不起作用:

-> f = Number.prototype.toLocaleString.call
<- ƒ call() { [native code] }
-> typeof f
<- "function"
-> f(1)
<- Uncaught TypeError: f is not a function
    at <anonymous>:1:1

是否可以引用和使用某些函数的call“方法”并将其用作常规函数?

2 个答案:

答案 0 :(得分:1)

否,call是一种方法(从Function.prototype.call继承),就像任何共享方法都需要bound指向其目标一样,如果您想将其用作普通函数。在这种情况下,目标对象是toLocaleString函数:

const f = Function.prototype.call.bind(Number.prototype.toLocaleString);
console.log(f(1));

答案 1 :(得分:1)

问题在于 any 函数的call属性等同于Function.prototype.call,如果没有调用上下文,则不能单独调用它:

console.log(Number.prototype.toLocaleString.call === Function.prototype.call);

解决方案是显式地给予新创建的函数原始函数的调用上下文,这可以通过bind完成:

const f = Number.prototype.toLocaleString.call.bind(Number.prototype.toLocaleString);
console.log(f(3333));