函数调用函数本身作为foobar.call(foobar)的目的是什么?

时间:2014-01-23 18:20:47

标签: javascript facebook-javascript-sdk

我在阅读源代码时遇到了一个问题。代码示例如下:

// ... some code omitted
function p() {var u=new i();this. $Arbiter0=new s(); this.$Arbiter3=[];}
p.prototype.subscribe = function() { ... }

p.call(p) // <-- what is the purpose of this statement?

我是JavaScript的新手。我从教科书中读到,当你使用Function.call(Function)时,它通常意味着借用另一个函数构造函数,以便做一些代码重用/继承的东西。但是,我不确定在这个代码示例中这样做的目的是什么,我的意思是,函数调用函数本身

澄清:

我知道Function.call()的用法。我只是想知道,做foobar.call(foobar)的好处是什么?

====

完整的源代码如下:

https://fbstatic-a.akamaihd.net/rsrc.php/v2/y6/r/USEL5meM70H.js

在该源代码中搜索“p.call(p)”。该文件中只出现一次。

====

谢谢。

3 个答案:

答案 0 :(得分:3)

p.call(p)具有调用函数p的效果,因此函数体内this的值是函数本身。

这允许您在函数中向函数添加属性。

可以找到Function.call的相关文档here

由于这是缩小代码,因此该构造可能是缩小过程的工件。这里的意图似乎是初始化p;它可能正在建立用于存储订户的数据结构。

答案 1 :(得分:0)

.call的第一个参数是将在执行的函数中用作this的元素。

请参阅https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Function/call

答案 2 :(得分:0)

你知道在JavaScript中,函数也是对象。这意味着您可以拥有与函数关联的方法和属性。

例如:

我可以创建一个名为 foo 的函数,并在其中添加一个属性,如下所示

function Foo(){};
Foo.bar = [1,2,3,4,5];
Foo.sayName = function(){ alert("hi Tom")};

此方法称为静态方法(经典OOP模式:函数构造函数就像javascript中的类一样),因此您无需实例化 Foo 的对象来访问 sayName 方法。

回到实际问题。当您执行 Foo.call(Foo);

时会发生什么

call方法期望一个对象作为第一个参数,并调用它所调用的函数。调用该函数时,指针将指向传递的对象。在这种情况下,它是Foo函数(Object)本身。

假设 Foo 函数以这种方式写入

function Foo(){
  this.bar = [1,2,3,4,5];
  this.sayName = function(){ alert("hi")};
}

执行Foo.call(Foo)后,您可以看到实际的 Foo 函数(Object)将具有属性 bar 和方法 sayName 增加了。

我猜你发送的脚本正在这样做以减少代码重复。