我正在阅读Javascript书'Speaking Javascript'。在一个例子中,作者正在模拟Date构造函数的apply函数。
new (Function.prototype.bind.apply(Date, [null,2011,11,24]))
该陈述非常令人困惑,当我尝试搞清楚时,我对null的存在感到困惑,而且在数组中也是如此。任何人都可以通过解释本声明的内部来帮助我。
答案 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
,构造函数的参数始终为:2011
,11
, 24
。
new (Date.bind(null,2011,11,24));
您可以使用new
关键字调用构造函数,该关键字创建Date
的实例,其中年份为2011年,月份为12月(因为1月份为0),日期为24日..