2011-03-14 63 views
0

我正在研究一些JS,其中函數是通過引用傳遞的,而且很難看到有時會調用哪個函數。它將通過7-8個函數傳遞,每個函數都有大量的參數,因此追蹤它的來源非常耗時。我正在改變一點點,但我已經能夠弄清楚,看看哪些功能的唯一方法實際上是被稱爲是做這樣的事情:如何判斷在javascript中引用哪個函數?

 if (console && console.log && method.toSource) { 
      console.log(method.toSource()); 
     } 

在這隻作品FF,但至少可以搜索被調用函數的來源。有沒有更好的辦法?

+0

爲什麼你必須知道哪個函數被傳遞?由於參數?對我來說,你應該改變你的設計。一方面靈活,但不得不知道你正在處理的具體事例似乎並不合適。你能詳細說明一下上下文嗎?還是隻是爲了調試? – 2011-03-14 19:58:19

+1

對我來說,如果我做了'console.log(myFunction)',然後點擊控制檯中的輸出,它就會直接跳轉到Script選項卡中的函數。 – nickf 2011-03-14 19:59:02

+0

@felix下面是一個例子。從項目列表中選擇某個項目時出現問題。我需要找到該項目被選中時調用的函數,並查看那裏發生了什麼。它看起來像onclick()。 Obv我可以找出該方法的設置,但有時需要很長時間,因爲它本身可能是一個傳遞的函數。代碼量很大,所以我需要一種快速自動的方式來查找它,而不是手動查看。 – Shawn 2011-03-14 20:06:03

回答

1

嘗試此

var whee = { 
    test: function(ab) { 
     console.log(ab); 
     this.test2('Hello', 'World'); 
    }, 

    test2: function(a, b) { 
     console.log(a+' '+b); 
    } 
}; 

function augment(obj, withFn) { 
    var name, fn; 
    for (name in obj) { 
     fn = obj[name]; 
     if (typeof fn === 'function') { 
      obj[name] = (function(name, fn) { 
       var args = arguments; 
       return function() { 
        withFn.apply(this, args); 
        fn.apply(this, arguments); 
       } 
      })(name, fn); 
     } 
    } 
} 

augment(whee, function(name, fn) { 
    console.log("calling " + name); 
}); 

whee.test('hi'); 

功能擴充需要一個物鏡作爲第一個參數,並作爲第二功能。它循環遍歷尋找函數的對象的所有成員。當它找到一個時,它用一個調用傳入函數的函數替換它,然後調用原始函數。我偷走了這個stackoverflow answer幾乎所有的代碼。

當您將窗口對象傳遞給窗口對象時,它看起來好像不太好,所以希望您的函數不是在窗口範圍內聲明的。

也有這answer他們試圖覆蓋Function.prototype.call函數與他們自己的。我無法在Firefox中使用它,但也許你會有更好的運氣。

+0

這隻有在他已經有了一些關於它可能是哪個功能的想法時纔有效。 – 2011-03-14 20:01:58

+0

這個應用程序有15000行的js ... – Shawn 2011-03-14 20:03:00

+0

它看起來像螢火蟲有一個通話記錄選項卡。我從來沒有使用它,但它可能適合你。 http://getfirebug.com/javascript – 2011-03-14 20:18:59

1

在右下角
點擊腳本選項卡上的錯誤圖標安裝Firefox
安裝的Firebug插件
點擊
單擊啓用
重新加載頁面
點擊右側面板上的堆棧選項卡上的螢火

1

功能可參照進行比較,所以如果你有一本字典像亞歷克斯·布朗的回答是:

var whee = { 
    test: function(ab) { 
     console.log(ab); 
     this.test2('Hello', 'World'); 
    }, 

    test2: function(a, b) { 
     console.log(a+' '+b); 
    } 
}; 

那麼你可以比較你的每個現在匿名參考:

function whichFunc(func, funcDict) { 
    for (var funcname in funcDict) { 
     if (func == funcDict[funcname]) { 
      return funcname; 
     } 
    } 
} 

很簡單。

相關問題