Function.prototype.call.call的简写?

时间:2015-06-17 10:47:21

标签: javascript function functional-programming

调用函数的方法

考虑这个简单的功能:

function my(p) { console.log(p) }

我可以这样称呼它:

my("Hello");

也是如此:

my.call(this, "Hello");

此外,这是可能的:

Function.prototype.call.call(my, this, "Hello");

功能方式的简写

我对最后一个选项感兴趣 - 功能最强的选项,但由于时间太长,我试图做一个简写:

var call = Function.prototype.call.call;

为了打电话给我这样:

call(my, this, "Hello");

但是我得到了这个TypeError:

TypeError: Function.prototype.call called on incompatible undefined

有人知道,这里有什么问题吗?

3 个答案:

答案 0 :(得分:8)

当你说

var call = Function.prototype.call.call;

最后call失去了它的实际背景。您需要明确说明call属于Function.prototype.call

你可以通过创建一个新函数来实现这一点,这个函数实际上就像这样绑定它

var call = Function.prototype.call.call.bind(Function.prototype.call);
call(my, this, "Hello");
// Hello

bind函数返回一个新函数,在调用时将上下文(this)设置为Function.prototype.call

答案 1 :(得分:4)

据推测,

call会在内部使用this

通过无上下文调用它,您已将this的内部值从有权访问函数原型的内容更改为window

答案 2 :(得分:3)

如果你想这样做,那么考虑一下(如果你有一个符合ES5的解释器):

var call = Function.prototype.call.bind(Function.prototype.call)

bind函数确保函数调用时上下文this变量)为Function.prototype.call而不是undefined,如你所见。