2016-08-22 60 views
1

我是Javascript新手,需要對此腳本進行更改。然而,我注意到這一行代碼讓我徹底困惑。此聲明是否會評估爲真?

function FIValidateForm(aForWhom, aDoNotShowWarning, aFromWhere) 
{ 
    try 
    { 
     PAIWarnings = ''; 
     var pBlFalg = true; 

     if (pBlFalg) 
      pBlFalg = mfpCheckForFISave(aForWhom, aDoNotShowWarning, aFromWhere); 

     if (pBlFalg == true) 
      pBlFalg = PAIErrors(); 

     if ((pBlFalg) && (FIValidateForm.arguments.length == 1)) 
      mfpIFWarnings(); 

     return pBlFalg; 
    } 
    catch (err) 
    { 
     logError(err, arguments.callee.trace()); 
    } 
} 

在運行時,如果我把一個斷點上第三if聲明和檢查FIValidateForm.arguments我可以看到3個項目的數組。第一個包含string,第二個包含null,第三個包含undefined。該陣列仍然有3的長度。

我是否正確的假設無論通過什麼樣的方法,FIValidateForm.arguments.length == 1將永遠是false?還是有一些其他值我不知道/另一種方法來調用這種方法,以便arguments.length會等於1?

編輯:我看到JS有一個arguments.lengthFunction.length。後者返回預期的數量的參數...那麼,如何調用一個方法,以便在函數定義爲3時值爲1?

+3

嘗試用第一個參數調用該函數,看看會發生什麼。 –

回答

1

我正確地認爲無論傳遞給這個方法的是哪一個,FIValidateForm.arguments.length == 1都將是錯誤的嗎?

不,你可使其FIValidateForm.arguments.length 1通過這樣做:

FIValidateForm(justOneArgHere); 

arguments代表實際參數的功能。 (見低於約argumentsFIValidateForm.arguments

如果你想要的功能的元數(正式聲明的參數個數),這就是FIValidateForm.length,並沒有改變。

那麼如何調用一個方法,使得當函數定義爲3時該值爲1?

JavaScript根本不執行正式參數的數量;你可以不帶任何參數,一個參數或者15來調用你的函數。如果沒有提供一個正式的參數(一個聲明的參數,比如你的aDoNotShowWarning),它在函數調用中的值將是undefined。如果您提供以上的自變量,則只能通過arguments僞陣列訪問它們(在ES5及更低版本中)。 (在ES2015及以上版本中,您可以將最後一個參數設置爲「休息參數」,這意味着它將成爲此時所有參數的數組。)


實施例:函數的

function foo(a, b, c) { 
 
    console.log(arguments.length); 
 
    console.log(foo.length); 
 
} 
 
foo(1); 
 
foo(1, 2);


arguments屬性(例如,FIValidateForm.arguments)是一個非標準擴展爲JavaScript ,這是明確的通過嚴格模式棄用(上面的示例會在嚴格模式下引發錯誤)。只需使用爲正常功能定義的獨立符號arguments(就像它是一個局部變量)。

(在ES2015或更高版本,可以儘量避免使用arguments在所有使用其他符號對你的論點,而不是聲明)

1

不,它不會永遠是假的。

  • 如果你把它作爲FIValidateForm(),然後FIValidateForm.arguments.length === 0

  • 如果你把它作爲FIValidateForm(arg1),然後FIValidateForm.arguments.length === 1

  • 如果你把它作爲FIValidateForm(arg1, arg2),然後FIValidateForm.arguments.length === 2

  • 如果你叫它FIValidateForm(arg1, arg2, arg3),然後FIValidateForm.arguments.length === 3

  • 等等

Howver,不使用FIValidateForm.arguments。在嚴格模式下這是不好的做法和禁止。改爲使用arguments

1

TL; DR:如果您只使用一個參數調用該函數,則functionName.arguments.length === 1將爲true。


是,FIValidateForm.arguments.length給你打電話FIValidateForm帶參數的準確數量。

考慮這個功能f

function f(first, second) { 
    console.log('first argument:', first); 
    console.log('second argument:', second); 
    console.log('number of arguments:', f.arguments.length); 
} 

和這兩種情況下:

// case 1: 
f('something'); 
// prints: 
// first: something 
// second: undefined 
// number of arguments: 1 

// case 2: 
f('something', undefined); 
// prints: 
// first: something 
// second: undefined 
// number of arguments: 2 

注意如何undefined是缺少參數的 「默認」 值,但不像一個明確undefined說法,缺少參數不計入f.arguments.length