2011-09-20 82 views
1

我已經編寫了一個包含很多函數和函數調用的程序。我希望能夠在每個函數調用之前調用代碼。例如,每次調用某個函數時,都要有控制檯日誌每次調用一個函數都要執行的代碼

console.log("A function has been called!"); 

我想一勞永逸地寫這個,而不是經過每個函數聲明。我想這與CSS pseudo elements:before:after的精神類似,但應用於JavaScript中的函數調用。

+1

這只是用於調試或者你有一些更深層次的目的是什麼? – hugomg

+0

我想在每個函數調用中注入1ms暫停以允許DOM重繪順利進行。 – Randomblue

+1

Javascript沒有睡眠功能,可以讓您輕鬆做到這一點;不是每個*函數都會「需要」改變(只有重繪的函數),最後,這聽起來太瘋狂了 - 還有更多的標準方法可以解決這個問題。 – hugomg

回答

3

我不認爲有任何內置的方式來做這樣的事情。爲什麼不使用像Firebug這樣的JavaScript調試器,並在您認爲可能給您帶來麻煩的功能上設置斷點?

+0

即使有辦法做到這一點,我懷疑它會比propper調試器更好。 – hugomg

+0

同意。 AFAIK沒有辦法 – Marshall

+0

一旦你學習了它,Firebug是一個適當的調試器。 – orlp

0

我從來沒有見過任何人這樣做過,所以我假設這是不可能的。

我做了一個快速的谷歌搜索,沒有什麼有用的回來。只是繼承,但我不明白這特別有用。

看起來像bdesham打我吧!

1

我不知道如何自動注入控制檯噴涌爲每個函數。但是如果你想明確哪些函數將日誌記錄到控制檯,你可能會使用閉包。

function ConsoleLogWrap(obj, funcname, msg) { 
    var xmsg = msg; 
    var xfuncname = funcname; 
    var xobj = obj; 

    obj[funcname+"$"] = obj[funcname]; 
    obj[funcname] = function() { 

     try { 
      console.log(xmsg); 
     } catch(e) { 
     } 

     xobj[xfuncname+"$"](arguments); 

    }; 

} 


function Addition(x, y) { 
    return x + y; 
} 

ConsoleLogWrap(window, "Addition", "Addition was called"); 

window.Addition(5,5); // this will spew out "Addition was called" and return the result of 5+5. 
+0

我曾經發布過的東西有很多的錯誤。上面的工作! – selbie

1

您可以通過擴展Function.prototype方法添加到您創建的所有功能。

爲了使功能異步運行,你似乎在您的評論來表示,您可以添加這樣的功能:

Function.prototype.makeAsync = function() { 
    var func = this; 
    var args = arguments; 
    setTimeout(function() { 
     func.call.apply(func, args); 
    }, 1); 
}; 

...然後調用它像這樣:

function my_func(a, b, c) { 
    console.log(this); 
    console.log(a, b, c); 
} 

my_func.makeAsync(element, 1, 2, 3); 

請注意,您傳遞給makeAsync的第一個參數將成爲您調用的函數的this值。

DEMO:http://jsfiddle.net/3kuad/

相關問題