2014-01-23 25 views
0

我在閱讀源代碼時遇到了問題。代碼示例如下:函數調用函數本身作爲foobar.call(foobar)的目的是什麼?

// ... 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

p.call(p)具有調用函數p的效果,使得函數體內的值this是函數本身。

這允許您從函數內向函數添加屬性。

Function.call的相關文檔可參見here

由於這是縮小的代碼,因此這個構造可能是縮小過程的人工產物。看來這裏的意圖是初始化p;它可能會建立用於存儲訂戶的數據結構。

+0

對不起。我沒有清楚地問清楚。我想問一下調用函數本身的函數有什麼好處? @Dancrumb – user1481096

+0

該函數不調用它自己。它被稱爲,它本身就是體內「this」的價值。至於「爲什麼?」,我以前沒有真正看到過。我不知道這是一種特別常見的模式。不過,這是有效的JS。 – Dancrumb

0

你知道,在JavaScript中,函數也是對象。這意味着您可以擁有與函數關聯的方法和屬性。

例如:

我可以創建一個名爲功能和屬性添加到它像下面

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

這種方法被稱爲靜態方法(經典OOP模式:函數的構造法就像javascript中的一個類),這樣你就不需要實例化一個對象Foo來訪問sayName方法。

回到實際的問題。當你做什麼時會發生什麼Foo.call(Foo);

調用方法期望一個對象作爲第一個參數,並調用它所調用的函數。當函數被調用時,這個指針將被指向傳遞的對象。在這種情況下,它是Foo函數(Object)本身。

假設,如果功能是這樣寫的

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

執行Foo.call(美孚)後,就可以看到實際的美孚功能(對象)將有性能酒吧和方法sayName被添加。

我猜你發送的腳本是這樣做的,以減少代碼重複。

相關問題