2015-07-02 11 views
6

Ich bin neu in der JavaScript-Programmierung (und Skriptsprachen im Allgemeinen), aber ich habe JS Lint verwendet, um mir zu helfen, wenn ich Syntaxfehler mache oder versehentlich eine globale Variable deklariere.Kann ich verhindern, dass eine falsche Anzahl von Parametern an Methoden mit JS Lint, JS Tipp oder einem anderen Tool übergeben wird?

Es gibt jedoch ein Szenario, das JS Lint nicht behandelt, was ich für unglaublich praktisch halten würde. Sehen Sie den Code unten:

(function() { 
    "use strict"; 
    /*global alert */ 

    var testFunction = function (someMessage) { 
     alert("stuff is happening: " + someMessage); 
    }; 

    testFunction(1, 2); 
    testFunction(); 
}()); 

Beachten Sie, dass ich die falsche Anzahl von Parametern zu Testfunktion am Übergang. Ich sehe mich nie in einer Situation voraus, wo ich absichtlich einen Parameter weglassen oder einen zusätzlichen hinzufügen würde. Weder JS Lint noch JS Hint halten dies jedoch für einen Fehler.

Gibt es ein anderes Tool, das das für mich fangen würde? Oder gibt es einen Grund, warum solche Parameter nicht fehlerhaft überprüft werden sollten?

+0

Ist das genau das, wonach Sie fragen? https://jslinterrors.com/this-function-has-too-many-parameters –

+0

Nein.Das scheint eine Grenze dafür zu sein, wie viele Parameter die Funktion haben kann. Es interessiert mich nicht besonders, ob die Funktion 2 oder 7 Parameter hat. Ich will nur nicht eine Funktion, die 2 Parameter mit einem Anruf hat, die in 7 geht. – tandersen

+0

Ah, so dass Sie eine allgemeine Lösung anders als jede Funktion mit einem benutzerdefinierten Wert wie min = 3 und max = 3 für eine 3 markieren möchten -Parameter-Funktion. Ich habe keine solche Flusenregel gesehen. –

Antwort

3

Dies ist in der Regel mit keinem statischen Analysewerkzeug möglich. Dafür gibt es mehrere Gründe:

  • Im Allgemeinen können JS-Funktionen eine beliebige Anzahl von Argumenten akzeptieren.
  • Die meisten (alle?) Linters funktionieren jeweils nur in einer Datei. Sie wissen nichts über in anderen Dateien deklarierte Funktionen
  • Es gibt keine Garantie, dass eine Eigenschaft, die als eine Funktion aufgerufen wird, die Funktion ist, die Sie erwarten. Betrachten Sie diesen Code-Schnipsel:

    var obj = { myFunc : function(a,b) { ... } }; 
    var doSomething(x) { x.myFunc = function(a) { ... }; }; 
    doSomething(obj); 
    obj.myFunc(); 
    

Es gibt keine Möglichkeit zu wissen, dass myFunc nun eine andere Anzahl von Argumenten nach dem Aufruf von doSomething nimmt.

JavaScript ist eine dynamische Sprache und Sie sollten das akzeptieren und annehmen.

Statt sich auf Linting zu verlassen, um Probleme zu erfassen, die nicht beabsichtigt waren, würde ich empfehlen, den Funktionen Vorbedingungen hinzuzufügen, die die Überprüfung durchführen.

eine Hilfsfunktion wie folgt erstellen:

function checkThat(expression, message) { 
    if (!expression) { 
    throw new Error(message); 
    } 
} 

es dann wie folgt verwenden:

function myFunc(a, b) { 
    checkThat(arguments.length === 2, "Wrong number of arguments."); 

Und mit der richtigen Unit-Tests, sollten Sie nie diese Fehlermeldung in der Produktion sehen.

1

Es ist nicht nativ in Javascript möglich. Sie müssten, so etwas tun:

var testFunction = function (someMessage) { 
    var args = Array.prototype.slice.call(arguments); 
    if (args.length !== 1) throw new Error ("Wrong number of arguments"); 
    if (typeof args[1] !== string) throw new Error ("Must pass a string"); 
    // continue 
}; 
0

Paul Irish demoed einen Hack für diese eine Weile zurück ... undefined am Ende der Parameter übergeben ...

var testFunction = function (someMessage, undefined) { 
    alert("stuff is happening: " + someMessage); 
}; 

Er demos es here ... sehen Sie, ob Sie danach suchen.