2014-02-17 18 views
0

所以我要調用一個函數有沒有辦法檢查函數的第二次調用是否存在某些條件?

myfunction(); 

我希望能有我的代碼調用它一次,並罰款,但如果我的代碼調用它第二次,我想檢查一下,如果某些條件是真的,如果是的話,我希望函數不能運行。如果這些條件不成立,那麼我希望函數像往常一樣運行。我只想知道,只有第二次調用該函數時,特定的事情纔是真實的,並且不允許我的函數再次運行,直到這些條件不再成立爲止。

if(condition) { 
//don't run function code for as long as this is true. 
} 
else{ 
//business as usual, run the code 
} 

我想在第二次調用函數時總是這樣做。所以第一個函數調用,不檢查。在第二個電話,檢查。在第三次呼叫不檢查,第四次呼叫檢查等。基本上,其他每次調用該函數,檢查是否有某些條件爲真 如果是,則不要運行功能代碼。我非常感謝你的迴應。

回答

1

這很簡單。既然你在尋找什麼基本上是根據一些內部狀態改變其行爲的功能,它是對象的理想應用:

var o = { 
    calls: 0, 
    fn: function(){ 
     if(++this.calls%2){ 
      console.log('odd call'); 
     } else { 
      console.log('even call'); 
     } 
    } 
} 

如果你絕對必須有一個函數只(沒有對象),你可以使用immediately-invoked function expression (IIFE)返回的函數:

var fn = (function(){ 
    var calls = 0; 
    return function(){ 
     if(++calls%2){ 
      console.log('odd call'); 
     } else { 
      console.log('even call'); 
     } 
    } 
})(); 

這具有包封calls變量的優點:即不能被訪問或無功能的外部篡改。

作爲一個注意事項,這實現了什麼叫做「副作用」:也就是說,如果不理解函數的細節,就不能再預測函數的行爲。我不會教條主義,說副作用總是不好,但你必須小心他們:確保他們有道理,並且你的文件清楚瞭解發生了什麼。

+0

爲狀態添加一個函數最簡單的方法是閉包,爲什麼這麼強調對象呢? – 6502

+1

因爲一個對象明確表示存在_is_狀態。如果您對編程採取純粹的功能性態度,那麼在給定相同輸入的情況下,函數應始終返回相同的內容。關閉打破了這種形式。我並不是說這是一件壞事,但是對象確實宣傳自己具有這種功能,而功能通常預計會更加一致。 –

+1

對象解決方案是針對不同問題的答案。如果我需要將該函數傳遞給需要函數調用的其他人,那麼該對象是無用的(因爲調用者需要使用'o.fn(...)')或者我需要傳遞一個閉包。如果你在「純功能」陣營,並且你拒絕了你現在使用的電腦可能具有幾千兆字節純蒸餾狀態的想法,那麼我會說最好是讓JavaScript獨立並加入哈斯凱爾軍隊,宗教在一塊地毯下隱藏國家必需品。 – 6502

1

你需要一個超出函數範圍的索引變量。
是這樣的:

var index = 0; 

function myFunction() { 
    // TRUE on every second call 
    if (++index % 2 === 0) { 
     if (condition) { 
      // .... 
     } else { 
      // ... 
     } 
    } 
    // .... 
} 
0

你可以使用一個封閉:不是

function f(x, y, z) { 
    ... normal processing ... 
} 

創建一個閉包,每一個其他的通話將做檢查

var f = (function(){ 
      var do_check = true; 
      return function(x, y, z){ 
       do_check = !do_check; 
       if (do_check && ... check ...) { 
        ... special handling ... 
       } else { 
        ... normal processing ... 
       }; 
      })(); 

正如其他但是說我會說,將這種行爲隱藏在函數內似乎是一個不好的主意。一個更好的解決方案可能只是外部化(並記錄)狀態。

0

這不是你的問題的答案。

肯定會有答案,告訴你如何做到這一點,但我認爲「唯一的勝利舉動不是玩。」

具有在調用之間行爲不同的函數會使您的軟件非常難以使用(維護,測試,調試,推理)。

如果有需要函數在不同調用之間表現不同的原因,請關注系統的狀態,而不是純粹關於函數本身。

+0

你的意思是我不應該讓這個函數對自己的行爲有所不同,就像在不同的調用中改變它自己的代碼一樣? – Brandon

0

同意pkyeck,但爲什麼增加一個var。

var checkCall = 1; 
function myfunction(){ 
    if(checkCall){ 
     alert('true: so no code will run'); 
     checkCall = 0; 
    } else { 
     alert('run the code'); 
     checkCall = 1; 
    } 
} 
+1

IIUC原來的問題要求是每隔一個電話進行檢查。您的代碼只會執行一次檢查,而不會再次進行後續調用。 – 6502

+0

謝謝,我的錯誤 – Mahavir

相關問題