2013-02-16 17 views
0

我從此處工作的以前的程序員繼承了JS函數。我注意到在他的代碼中有兩個功能可以做同樣的事情,而且它們只有一點不同。根據傳遞給函數的參數更改條件以測試

第一個函數沒有參數,它的體內,他測試一個條件是這樣的:

function parseAll() { 
    for (var i = 0; i < 100; i++) { 
     if (obj.flag == 0) { 
      // do many other things I omit 
     } 
    } 
} 

第二個功能:

function parseOne(stringOne) { 
    for (var i = 0; i < 100; i++) { 
     if (obj.flag == 0 && obj.str = stringOne) { 
      // do other things I omit (same identical things as in the function parseAll 
     } 
    } 
} 

現在,我想的功能轉化爲一個功能,當第一個被覆蓋時,通過null,當它被稱爲第二個時,通過string

所以,兩者之間的差異只會成爲測試的條件。

如何以編程方式更改要測試的條件,基於傳遞給函數的參數?我想測試obj.flag==0如果我通過nullobj.flag==0 && obj.str=stringOne,如果我通過string。這可能嗎?怎麼樣?

回答

1

您可以通過幾種方式輕鬆檢測是否傳入參數。如果stringOne永遠不會""當你真正想使用它的「一」的情況下,則:

function parseOne(stringOne) { 
    for (var i = 0; i < 100; i++) { 
     if (obj.flag == 0 && (!stringOne || obj.str === stringOne)) { 
      // do other things I omit (same identical things as in the function parseAll 
     } 
    } 
} 

(我改變了你的obj.str = stringOneobj.str === stringOne只需一個=,它是一個任務,我假設這是一個錯字)。

然後,您可以撥打parseOne根本沒有參數(甚至不需要通過null)爲「全部」情況。

注意的是,上述假設它永遠不會有意義stringOne"",因爲""是falsey,所以!stringOne是真實的,我們會像對待「一切」的情況。如果它是有意義的""通過,只是想處理一個字符串,你必須改變的東西一點:

function parseOne(stringOne) { 
    var one = typeof stringOne !== "undefined"; 
    for (var i = 0; i < 100; i++) { 
     if (obj.flag == 0 && (!one || obj.str === stringOne)) { 
      // do other things I omit (same identical things as in the function parseAll 
     } 
    } 
} 

還有第三個選項,這是檢查arguments.length這是實際傳遞給參數的個數該函數(所有函數在調用期間的範圍內都有一個arguments對象),但在某些JavaScript引擎上可能會顯着減慢調用的速度(儘管通常不是真正重要的方式),並且在此不再需要。

+0

哇,非常感謝。 – ContentiousMaximus 2013-02-16 10:38:04

+0

@ContentiousMaximus:很高興幫助! – 2013-02-16 10:40:19

相關問題