我在阅读源代码时遇到了一个问题。代码示例如下:
// ... 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)”。该文件中只出现一次。
====
谢谢。
答案 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 强>增加了。
我猜你发送的脚本正在这样做以减少代码重复。