我已經編寫了一個包含很多函數和函數調用的程序。我希望能夠在每個函數調用之前調用代碼。例如,每次調用某個函數時,都要有控制檯日誌每次調用一個函數都要執行的代碼
console.log("A function has been called!");
我想一勞永逸地寫這個,而不是經過每個函數聲明。我想這與CSS pseudo elements:before
和:after
的精神類似,但應用於JavaScript中的函數調用。
我已經編寫了一個包含很多函數和函數調用的程序。我希望能夠在每個函數調用之前調用代碼。例如,每次調用某個函數時,都要有控制檯日誌每次調用一個函數都要執行的代碼
console.log("A function has been called!");
我想一勞永逸地寫這個,而不是經過每個函數聲明。我想這與CSS pseudo elements:before
和:after
的精神類似,但應用於JavaScript中的函數調用。
您基本上正在尋找JavaScript中的Aspect-Oriented Programming。請參閱Javascript AOP libraries。
更多問題:https://stackoverflow.com/questions/tagged/javascript+aop
我從來沒有見過任何人這樣做過,所以我假設這是不可能的。
我做了一個快速的谷歌搜索,沒有什麼有用的回來。只是繼承,但我不明白這特別有用。
看起來像bdesham打我吧!
我不知道如何自動注入控制檯噴涌爲每個函數。但是如果你想明確哪些函數將日誌記錄到控制檯,你可能會使用閉包。
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.
我曾經發布過的東西有很多的錯誤。上面的工作! – selbie
您可以通過擴展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
值。
這只是用於調試或者你有一些更深層次的目的是什麼? – hugomg
我想在每個函數調用中注入1ms暫停以允許DOM重繪順利進行。 – Randomblue
Javascript沒有睡眠功能,可以讓您輕鬆做到這一點;不是每個*函數都會「需要」改變(只有重繪的函數),最後,這聽起來太瘋狂了 - 還有更多的標準方法可以解決這個問題。 – hugomg