javascript应用并调用方法并链接在一起

时间:2015-12-11 18:09:40

标签: javascript

在本文js log function中,有一个声明:
Function.prototype.apply.call(console.log,console,arguments);

我对这句话感到很困惑。

  1. 它做了什么?
  2. 我如何分析这个陈述?
  3. 或者通过一些想法或工具,我可以一步一步地弄明白吗?
  4. 是否可以将其简化为更多语句以达到相同的效果?例如:var temp = Function.prototype.call(console.log, console, arguments); Function.prototype.apply(temp);
  5. 感谢您的回复。

3 个答案:

答案 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上下文的函数。 applycall之间的区别在于前者采用参数的数组,后者在第一个参数后采用直接参数。例如:

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 consolethis,传递参数 伪数组arguments作为函数的离散参数。 因此,如果arguments中包含"hi", "there",则它将与:

相同
console.log("hi", "there");
  

我如何分析这个陈述?

     

或者通过一些想法或工具,我可以一步一步地弄明白吗?

让我们从applycall函数开始:它们都能够调用函数 在调用期间使用特定的this并将参数传递给该函数。 apply得到那些 来自单个数组的参数(或任何类似数组的参数)。 call将这些参数作为单独的参数。

通常情况下,您会看到applycall使用如下:

someFunction.apply(valueForThis, ["arg1", "arg2", "arg3"]);
// or
someFunction.call(valueForThis, "arg1", "arg2", "arg3");

applycall之间的唯一区别是他们期望得到他们的论点(apply = in 类似于数组的东西,call =作为单独的参数)。

那么,为什么那个代码不是这样做的呢?

console.log.apply(console, arguments);

谨慎:console.log是主机提供的功能。它可能不是真正的JavaScript 函数,因此可能没有apply属性。 因此,该代码避免依赖具有console.log属性的apply

这是Function.prototype的用武之地。它是对象的引用,它是所有真正的JavaScript函数的原型。 该原型是JavaScript函数的applycall属性的来源。 因此,如果我们担心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);