2016-08-22 3 views
1

Ich bin neu in Javascript und muss eine Änderung an diesem einen Skript vornehmen. Ich habe diese Codezeile bemerkt, die mich jedoch gründlich verwirrt hat.Wird diese Aussage jemals als wahr gewertet?

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()); 
    } 
} 

Während der Laufzeit, wenn ich an dieser dritten if Anweisung einen Haltepunkt setzen und prüfe FIValidateForm.arguments kann ich ein Array mit 3 Einzelteilen sehen. Die erste enthält eine string, die zweite ist null, und die dritte ist undefined. Das Array hat immer noch eine Länge von 3

korrigiere ich bin in der Annahme, dass, egal was man zu dieser Methode zu übergeben wurden, wird FIValidateForm.arguments.length == 1 immer false sein? Oder gibt es einen anderen Wert, den ich nicht kenne/alternative Methode, diese Methode aufzurufen, so dass arguments.length gleich 1 wäre?

Edit: Ich sehe JS hat eine arguments.length und eine Function.length. Letzterer liefert die erwartete Anzahl der Parameter ... Also, wie nennt man dann eine Methode, so dass der Wert 1 wäre, wenn die Funktion mit 3 definiert ist?

+3

Versuchen Sie, die Funktion nur mit dem ersten Argument aufzurufen und sehen Sie, was passiert. –

Antwort

1

Bin ich richtig in der Annahme, dass FIValidateForm.arguments.length == 1, egal was man zu dieser Methode übergeben würde, immer falsch ist?

Nein, können Sie machen ihre FIValidateForm.arguments.length 1 durch dies zu tun:

FIValidateForm(justOneArgHere); 

arguments stellt die tatsächlichen Argumente an die Funktion. (Siehe unter etwa arguments vs. FIValidateForm.arguments.)

Wenn Sie die arity die Funktion wollen (die Anzahl der formalen Argumente erklärt), das ist die FIValidateForm.length und es ändert sich nicht.

Also wie nennt man dann eine Methode, so dass der Wert 1 wäre, wenn die Funktion mit 3 definiert ist?

JavaScript erzwingt die Anzahl der formalen Argumente überhaupt nicht; Sie können Ihre Funktion ohne Argumente, ein Argument oder 15 aufrufen. Wenn ein formales Argument (ein deklariertes Argument wie aDoNotShowWarning) nicht angegeben wird, ist der Wert innerhalb des Funktionsaufrufs undefined. Wenn Sie mehr Argumente angeben, als sie deklariert sind, sind sie nur (in ES5 und darunter) über das Pseudo-Array arguments zugänglich. (In ES2015 und höher können Sie Ihr letztes Argument zu einem "Rest-Argument" machen, was bedeutet, dass es von diesem Punkt an ein Array aller Argumente sein wird.

)

Beispiel:

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


Die arguments Eigenschaft der Funktion (zB FIValidateForm.arguments) ist eine Nicht-Standard-Erweiterung JavaScript Das ist ausdrücklich Wird im strikten Modus veraltet (das obige Beispiel würde im strikten Modus einen Fehler auslösen). Verwenden Sie einfach das freistehende Symbol arguments, das für normale Funktionen definiert ist (als wäre es eine lokale Variable).

(Und in ES2015 oder höher können Sie arguments überhaupt durch die Verwendung Rest Notation auf Ihrem Argumente Erklärungen anstelle vermeiden verwenden.)

1

Nein, es wird nicht immer falsch sein.

  • Wenn Sie es als FIValidateForm() nennen, dann FIValidateForm.arguments.length === 0

  • Wenn Sie es als FIValidateForm(arg1) nennen, dann FIValidateForm.arguments.length === 1

  • Wenn Sie es als FIValidateForm(arg1, arg2) nennen, dann FIValidateForm.arguments.length === 2

  • Wenn Sie nennen es als FIValidateForm(arg1, arg2, arg3), dann FIValidateForm.arguments.length === 3

  • Und so weiter

Howver, verwenden FIValidateForm.arguments nicht. Es ist schlecht und im strikten Modus verboten. Verwenden Sie stattdessen arguments.

1

TL; DR: Wenn Sie die Funktion mit nur einem Argument aufrufen, wird functionName.arguments.length === 1 wahr sein.


Ja, FIValidateForm.arguments.length gibt Ihnen genau die Anzahl der Argumente, die Sie FIValidateForm mit nennen.

Betrachten Sie diese Funktion f:

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

und diese beiden Fälle:

// 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 

Beachten Sie, wie undefined die "default" Wert Argumente für fehlen, aber im Gegensatz zu einem expliziten undefined Argument, eine fehlende Argument wird nicht in f.arguments.length gezählt.

Verwandte Themen