2011-06-07 40 views
0

如果我有一個函數問一個不存在的javascript參數有風險嗎?

foo() 

,我不帶任何參數的大部分時間打電話,但在特殊情況下,一個說法,是

var arg1 = arguments[0]; 
if (arg1) { 
    <special case code> 
} 

裏面的功能完全安全的事是什麼?

+0

這是有效的代碼,不應該引起任何問題 – 2011-06-07 14:11:59

回答

0

是的,這很好。一個合理的選擇是命名的說法,而不是使用arguments對象:

function foo(specialArg) 
{ 
    if (specialArg) 
    { 
     // special case code 
    } 
} 

注意if(bar)測試感實性的bar。如果您致電foo與任何falsy值,如foo(0),foo(false),foo(null)等,特殊情況下代碼將不執行上述功能(或您的原始功能,就此而言)。您可以將測試更改爲

if (typeof specialArg !=== 'undefined') 
{ 
    // ... 
} 

確保在提供參數但執行錯誤時執行特殊情況代碼。只要你記錄的行爲足夠我看不出有什麼毛病

function foo(arg1){ 

if (arg1){ 
    // Special case 
} 
else{ 
    // No argument 

} 
// Rest of function 
} 
1

是的,它是安全的。 除非您通過false,"", 0,nullundefined作爲參數。最好再檢查undefined的值。 (如果你通過undefined那麼強硬!這不是一個有效的論點)。

有3個流行檢查

  • foo === undefined標準入住某人(惡)可能會做window.undefined = true
  • typeof foo !== "undefined":類型檢查和安全。
  • foo === void 0void 0回報真正undefined

但這是首選

function myFunction(foo) { 
    if (foo !== undefined) { 
    ... 
    } else { 
    ... 
    } 
} 
+0

這不是一個檢查foo是否未定義的好方法(取決於您的範圍)。有人可能會設置未定義的東西(因爲undefined可以像其他變量一樣設置 - 一個Javascript缺陷)。看到這個證明:http://jsfiddle.net/xonev/v4AQH/。首選方法是'typeof foo!==「undefined」'。 -1 – 2011-06-07 14:20:01

+0

@StevenOxley我提到有3種方式來處理這個問題。我提到'foo === undefined'有一個弱點。我會反駁說,如果我發現任何有意將「undefined」設置爲其他值的開發者值得在手腕上打一記耳光,並且這樣做是一個_BUG_被修復。首選方法是'foo!== void 0',因爲它很簡單。你是否也希望屏蔽'undefined'被重新分配與屏蔽'Object.prototype = null'一樣迂迴! – Raynos 2011-06-07 14:28:49

0

你可以做到這一點。

但是,您最好檢查參數長度,而不是現在的做法。例如,你說:

myFunction(0); 

它永遠不會處理參數。

如果它是一個單一的可選參數,你最好把它作爲函數中的一個命名參數,並檢查一個定義值是否被傳入,取決於你的用例。

0

0

您感興趣的基本事實是「被foo稱爲0或1個參數?」。所以我會測試arguments.length以避免未來出現問題,並將其評估爲false。

相關問題