2015-07-02 4 views
6

Sono nuovo alla programmazione javascript (e ai linguaggi di scripting in generale), ma ho usato JS Lint per aiutarmi quando faccio errori di sintassi o dichiaro accidentalmente una variabile globale.È possibile impedire il passaggio di un numero errato di parametri ai metodi con JS Lint, JS Hint o qualche altro strumento?

Tuttavia, esiste uno scenario che JS Lint non copre, che ritengo sarebbe incredibilmente utile. Vedere il codice qui sotto:

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

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

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

Si noti che sto passando un numero errato di parametri da TestFunction. Non mi aspetto mai in una situazione in cui vorrei lasciare intenzionalmente un parametro o aggiungerne uno in più. Tuttavia, né JS Lint né JS Hint considerano questo un errore.

C'è qualche altro strumento che potrebbe catturare questo per me? O c'è qualche ragione per cui il passaggio di parametri del genere non dovrebbe essere controllato?

+0

E 'vicino a quello che stai chiedendo? https://jslinterrors.com/this-function-has-too-many-parameters –

+0

No.Questo sembra essere un limite al numero di parametri che la funzione può avere. Non mi interessa particolarmente se la funzione ha 2 o 7 parametri. Semplicemente non voglio chiamare una funzione che ha 2 parametri con una chiamata che passa in 7. – tandersen

+0

Ah quindi vuoi una soluzione generale oltre a contrassegnare ogni funzione con un valore personalizzato come min = 3 e max = 3 per un 3 -parametro funzione. Non ho visto una tale regola. –

risposta

3

Questo non è generalmente possibile con qualsiasi strumento di analisi statica. Esistono diversi motivi:

  • In generale, le funzioni JS possono accettare qualsiasi numero di argomenti.
  • La maggior parte (tutti?) I linters funzionano solo su un singolo file alla volta. Non sanno nulla delle funzioni dichiarate in altri file
  • Non c'è alcuna garanzia che una proprietà invocata come funzione sia la funzione che ci si aspetta. Considerate questo frammento:

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

Non c'è modo di sapere che myFunc prende ora un diverso numero di argomenti dopo la chiamata a doSomething.

JavaScript è un linguaggio dinamico e dovresti accettarlo e accettarlo.

Invece di fare affidamento su un po 'di lanugine per individuare problemi a cui non era destinato, consiglierei di aggiungere le condizioni preliminari alle funzioni che esegue il controllo.

Creare una funzione di supporto come questo:

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

quindi utilizzarlo in questo modo:

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

E con una corretta unit testing, si dovrebbe mai vedere questo messaggio di errore nella produzione.

1

Non è nativamente possibile in javascript. Si dovrebbe fare qualcosa di simile:

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 un hack per questo un po 'indietro ... passando undefined alla fine dei parametri ...

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

Egli Demos è here ... vedi se è quello che stai cercando.

Problemi correlati