以下习语的目的可能是什么?
Function.apply.call(fn, console, args);
我以前从未见过申请“被叫”。
答案 0 :(得分:4)
要拨打电话,我们需要'功能','此'和'参数'。
单独使用Function.apply
或Function.call
,您可以指定“这个”。和'论证'但不是要调用的函数,因为它们使用自己的this
作为函数,所以我们需要一个额外的层来设置这个'这个'值。
你可以说:
fn.apply(console, args);
但如果fn.apply
被覆盖,则无法正常工作。
答案 1 :(得分:2)
这当然不是惯用的:-)让我们看看它的作用:
Function.apply
是Function.prototype.apply
方法 - Function
constructor继承它。.call
ed,fn
为this
值,console
为第一个参数,args
为第二个参数。< / LI>
所以这应该等同于fn.apply(console, args)
,fn
会在console
对象上使用动态console
列表调用args
(可能是Function.apply.call(fn, console, args)
方法)。
那么为什么这样做呢?因为fn.apply(console, args)
并不完全等同于fn.apply === Function.apply
!只有在.apply
时,情况可能并非如此
不可能有人会覆盖fn
财产 - 如果他这样做是他的错 - 但是存在一个现实世界的问题:Function.prototype
对象没有继承自{{1}},即使它们是可调用的。这可能发生在主机对象的错误实现中;最着名的例子是Internet Explorer's console
object。