在本文js log function中,有一个声明:
Function.prototype.apply.call(console.log,console,arguments);
我对这句话感到很困惑。
var temp = Function.prototype.call(console.log, console, arguments);
Function.prototype.apply(temp);
感谢您的回复。
答案 0 :(得分:1)
Apply是函数原型的一个函数。调用也是函数原型的一个函数。 Apply是一个函数,因此,它调用了它的原型。所有这一切都是调用apply函数。
了解更多关于申请的信息: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Function/apply
答案 1 :(得分:1)
让我们一次看一部分。
Function.prototype.apply
,更常见的是myBigFatFunction.apply
,可让您调用具有与通常情况不同的this
上下文的函数。 apply
和call
之间的区别在于前者采用参数的数组,后者在第一个参数后采用直接参数。例如:
myStr.substring(5)
String.prototype.substring.apply(myStr, [5]);
String.prototype.substring.call(myStr, 5);
^ all equivalent
但是,由于我无法完全解释自己的原因,JavaScript可访问的一些浏览器本机函数没有此功能作为属性(例如,console.log.apply
)。尽管如此,仍然可以手动调用它;这样console
仍然是this
,当它调用log
时,这就是给定函数正在做的事情。
所有复杂性的原因是他们想要传递arguments
特殊变量。这是一个存在于所有函数中的关键字,它将函数的所有参数表示为类似数组的对象(因此,适用于Function.prototype.apply
)
您的变量建议可能只需要console.log
作为参数1调用console
,将arguments
调用为变量2,并返回结果,而不是在变量中为您提供函数。如果你想要一个缩短的引用,你可以使用Function.prototype.bind
,但这实际上可能会延长你的代码。
答案 2 :(得分:1)
它做了什么?
在调用过程中调用console.log
console
为this
,传递参数
伪数组arguments
作为函数的离散参数。
因此,如果arguments
中包含"hi", "there"
,则它将与:
console.log("hi", "there");
我如何分析这个陈述?
或者通过一些想法或工具,我可以一步一步地弄明白吗?
让我们从apply
和call
函数开始:它们都能够调用函数
在调用期间使用特定的this
并将参数传递给该函数。 apply
得到那些
来自单个数组的参数(或任何类似数组的参数)。 call
将这些参数作为单独的参数。
通常情况下,您会看到apply
或call
使用如下:
someFunction.apply(valueForThis, ["arg1", "arg2", "arg3"]);
// or
someFunction.call(valueForThis, "arg1", "arg2", "arg3");
apply
和call
之间的唯一区别是他们期望得到他们的论点(apply
= in
类似于数组的东西,call
=作为单独的参数)。
那么,为什么那个代码不是这样做的呢?
console.log.apply(console, arguments);
谨慎:console.log
是主机提供的功能。它可能不是真正的JavaScript
函数,因此可能没有apply
属性。
因此,该代码避免依赖具有console.log
属性的apply
。
这是Function.prototype
的用武之地。它是对象的引用,它是所有真正的JavaScript函数的原型。
该原型是JavaScript函数的apply
和call
属性的来源。
因此,如果我们担心console.log
没有它(例如,如果它不从Function.prototype
继承),我们可以直接从该原型对象中获取apply
。 / p>
因此,代码正在使用call
来呼叫apply
,并使用apply
来呼叫console.log
。
是否可以将其简化为更多语句以达到相同的效果?
不是真的,我们可以分开很多。我将尝试使用变量名来澄清:
var thisValue = console;
var functionToCall = console.log;
var applyFunction = Function.prototype.apply;
applyFunction.call(functionToCall, thisValue, arguments);