2010-07-22 43 views
2

我希望能夠遍歷文檔中的所有JavaScript函數,例如,爲它們添加alert('ok');即時迭代和更改JavaScript函數

所以,如果我有:

function a(num) { 
    return num; 
} 

後,我跑我的JavaScript代碼,並調用這個函數,它會怎麼做:

{ 
    alert('ok'); 
    return num; 
} 

我知道我可以使用窗口訪問函數[。 funcName],但我如何迭代所有函數並編輯它們?

感謝

PS:我知道這是不是一個很好的主意,但它只是一個調試環境

回答

1
for (var i in window) { 
    if (typeof window[i] == 'function') console.log(i); // logs the function name 
} 

這讓你的函數列表。你不能修改JavaScript中的函數,你只能包裝它們。這意味着你製作了一個函數的副本,並用一個包裝器替換原件。比方說,我們有這個功能:

function a(num) { return num;} 

然後我們總結這樣說:

functionName = 'a'; // original function name 
window['_original_' + functionName] = window[functionName]; // putting it in a safe place 
window[functionName] = function() { // creating wrapper 
    alert('ok'); //logger function 
    return window['_original_' + functionName].apply(null, arguments); //invoke original 
} 

這給了你唯一的全球空間功能,例如它不會記錄jQuery插件。如果你想記錄所有的功能使用Firebug的分析器。

+0

謝謝! 但只是一個點,它不會工作 正確的方法是: \t \t窗口[I] =功能(X){ \t \t \t復位功能(){ \t \t \t \t警報(X ); \t \t \t \t return window ['_ original_'+ x] .apply(null,arguments); \t \t \t} \t \t}(i); – Fernando 2010-07-22 19:47:36

0

而不是修改現有函數的代碼,我嘗試使用包裝現有函數的攔截器函數。只是一個快速實施(我們可以進一步提高)

function intercept(object, methodBindName, interceptor) { 
    var oldMethod = object[methodBindName]; 
    object[methodBindName] = function() { 
     interceptor.apply(null, arguments); 
     return oldMethod.apply(object, arguments); 
    } 
} 

function test1(msg) {alert(msg);} 
function test2() {alert('hi');} 

var methodNames = ['test1', 'test2']; 

for(var i = 0; i < methodNames.length; i++) { 
    intercept(window, methodNames[i], function(){alert('Hello');}) 
} 
test1('foo'); 
test2(); 
+0

oldMethod.apply(object,arguments);還應該返回值 – 2010-07-22 08:36:32

+0

@Alisey。更新。感謝您指出。 – 2010-07-22 08:42:05

+0

爲什麼''.apply(this,arguments)'這兩個函數?有時這些函數可能不會在'object'的上下文中被調用。 – gnarf 2010-07-22 09:06:49