在JavaScript中调用Function.prototype.bind上的apply()函数?

时间:2017-06-09 08:58:12

标签: javascript apply

我正在阅读Javascript书'Speaking Javascript'。在一个例子中,作者正在模拟Date构造函数的apply函数。

new (Function.prototype.bind.apply(Date, [null,2011,11,24]))

该陈述非常令人困惑,当我尝试搞清楚时,我对null的存在感到困惑,而且在数组中也是如此。任何人都可以通过解释本声明的内部来帮助我。

2 个答案:

答案 0 :(得分:2)

逐步展开表达

Function.prototype.bind.apply(Date, [null,2011,11,24])

此表达式apply的{​​{1}}函数使用bind作为上下文(Date)并带有参数列表this

首先[null,2011,11,24]只是一种访问Function.prototype.bind方法的方法,每个函数都从其原型继承。人们可以使用任何其他功能来获得它。例如bind或甚至var bind = (function(){}).bind

然后在var bind = Date.bind的{​​{1}}上下文fn.apply(ctx, [arg1, ..., argN])调用fn ctx ctx::fn(arg1, ..., argN) bind operator}

然后::大致相当于创建一个带有有界上下文和部分应用参数的新函数

fn.bind(ctx, arg1, ..., argN)

因此function(moreArg1, ..., moreArgN) { return fn.apply(ctx, [arg1, ..., argN, moreArg1, ..., moreArgN]) } bind.apply(fn, [ctx, arg1, ..., argN])

“相同”

将两者结合起来

fn.bind(ctx, arg1, ..., argN)

答案 1 :(得分:1)

Soooo,我绝不是一位专家,但让我对此采取行动,但让我们从最后开始:

数组是传递给Date构造函数的参数。您也可以使用call方法,在这种情况下,您不使用数组,但只需输入参数:

new (Function.prototype.bind.call(Date, null, 2011, 11, 24));

现在它变得更加混乱,我们在apply上获得了bind

我们知道,

apply会调用它应用的功能。在这种情况下bind。第一个参数是this属性,并设置call的上下文。在这种情况下Date。其余参数将传递给bind方法。 bind方法被调用如下:

.bind(null, 2011, 11, 24);

this参数为null,并被忽略。如您所知,bind返回一个可调用函数。这个可调用函数是调用bind的函数。在这种情况下Function.prototype。哪个是Function ....

的构造函数的原型

啊,现在我们有一个构造函数,this上下文设置为Date,构造函数的参数始终为:20111124

new (Date.bind(null,2011,11,24));

您可以使用new关键字调用构造函数,该关键字创建Date的实例,其中年份为2011年,月份为12月(因为1月份为0),日期为24日..