嘗試此
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中使用它,但也許你會有更好的運氣。
爲什麼你必須知道哪個函數被傳遞?由於參數?對我來說,你應該改變你的設計。一方面靈活,但不得不知道你正在處理的具體事例似乎並不合適。你能詳細說明一下上下文嗎?還是隻是爲了調試? – 2011-03-14 19:58:19
對我來說,如果我做了'console.log(myFunction)',然後點擊控制檯中的輸出,它就會直接跳轉到Script選項卡中的函數。 – nickf 2011-03-14 19:59:02
@felix下面是一個例子。從項目列表中選擇某個項目時出現問題。我需要找到該項目被選中時調用的函數,並查看那裏發生了什麼。它看起來像onclick()。 Obv我可以找出該方法的設置,但有時需要很長時間,因爲它本身可能是一個傳遞的函數。代碼量很大,所以我需要一種快速自動的方式來查找它,而不是手動查看。 – Shawn 2011-03-14 20:06:03