2013-06-19 165 views
0

所以我有一個遞歸函數用於反轉顏色。下面是代碼:在執行函數時執行某些操作jquery

function invert(id,what){ 
    var color = $(id).css(what); 
    var matchColors = /rgb\((\d{1,3}), (\d{1,3}), (\d{1,3})\)/; 
    var match = matchColors.exec(color); 
    var r = (255 - match[1]).toString() + ","; 
    var g = (255 - match[2]).toString() + ","; 
    var b = (255 - match[3]).toString(); 
    answer = 'rgb(' + r + g + b + ')' ; 
    $(id).css(what,answer); 
}; 

所以基本上我有一個可以在許多情況下被調用函數(特定ID的點擊,懸停在特定類等),我不知道他們。但是我需要知道每一次這個函數被調用。我怎麼能有一個外部代碼行設置一個變量等於函數被調用的次數?

+1

如果要計算函數調用自身的次數,則需要修改其源代碼。 – bfavaretto

+0

除了函數之外,沒有辦法計算函數在遞歸時觸發了多少次?我發現很難相信 –

+0

@RyanSaxe很難相信你不能重寫一個函數 –

回答

6

包裝你功能

var wrapped = (function wrapper(present) { 
    function wrapping() { 
     ++wrapping.count; // increment invocation count 
     return present.apply(this, arguments); 
    } 
    wrapping.count = 0; // counter, avaliable from outside too 
    return wrapping; 
}(invert)); 

如果您需要調用它invert過,之後重新分配invert

invert = wrapped; 
invert.count; // 0 
invert(); 
invert.count; // 1 
invert(); 
invert.count; // 2 
+0

請重新閱讀問題...我做了一個編輯,以便它可能完全超出原始函數的範圍,因爲函數不再是遞歸的 –

+0

@RyanSaxe你試過這個答案嗎? –

+0

@RyanSaxe你是否說過函數'invert'是在你無權訪問的範圍中聲明的? –

0

我不知道您的具體情況是什麼,但也許你可以用包裝材料覆蓋功能:

var invertOriginal = invert; 
var counter = 0; 

var invert = function(id, what, max) { 
    invertOriginal(id, what, max); 

    // do counter stuff here, e.g. 
    counter++; 
}; 
+0

不能改變原函數 –

+0

這不會改變原來的函數。它只是「重命名」該函數並調用重命名的版本。您可以在不修改原始源代碼的情況下使用此代碼 – compid

+0

請重新閱讀該問題...我已經進行編輯,以便可能完全超出原始函數,因爲函數不再是遞歸的 –

相關問題