2012-02-21 3 views
6

Tutti,JSLint - Non si modifica il parametro <x> quando si usano 'argomenti'?

Io uso JSLint per convalidare i miei file JS. Nel mio progetto più recente, sto usando il seguente formato per impostare i valori predefiniti per una serie di funzioni JavaScript (ulteriormente dettagliato here):

function(a, b, option) { 
    option = arguments.length > 2 ? option : "some default value"; 
    // ... 
} 

Questo però fa sì che l'ultima build di JSLint per produrre il seguente errore:

"Do not mutate parameter 'option' when using 'arguments'." 

Sono consapevole del fatto che l'utilizzo del metodo più comune per l'assegnazione dei valori predefiniti (ovvero) sopprime l'errore; tuttavia, questo produrrà un comportamento errato se intendo passare un valore false a option.

È l'unica soluzione a questo problema per introdurre una nuova variabile? es .:

var option2 = arguments.length > 2 ? option : "some default value"; 
+0

Una variabile locale, che è il suo "introdurre un secondo parametro" è una soluzione migliore. – Biswanath

risposta

6

Credo JSLint si avverte dal momento che si tenta di modificare uno degli argomenti di ingresso utilizzando un assegno con la parola chiave argomenti. JSHint, tuttavia, mi dà alcun avvertimento quando provo il tuo codice.

Una soluzione al problema potrebbe essere quella di verificare se option è definito o meno, in questo modo si va in giro il problema con l'invio dei valori falsy:

function(a, b, option) { 
    if(typeof option === "undefined") { 
     option = "some default value"; 
    } 
    // ... 
} 

Se si scopre che è ingombrante per scrivere questo typeof verifica ogni volta, creare una funzione isDef:

function isDef(param) { 
    return typeof param !== "undefined"; 
} 
function(a, b, option) { 
    option = isDef(option) ? option : "some default value"; 
    // ... 
} 

// Simon A.

+0

Grazie per il suggerimento: rimuovere il rischio di specificare un valore errato per 'arguments.length' è un grande vantaggio. Sfortunatamente, l'uso di questo metodo fa sì che JSLint produca lo stesso errore. – robyaw

+0

Sei sicuro? JSLint non si lamenta quando eseguo i due frammenti di codice sopra. –

+0

Risulta che entrambi possiamo avere ragione, a seconda della situazione. Nel mio codice, ho una funzione con due parametri che richiedono l'impostazione dei valori predefiniti. Stavo usando la soluzione solo sul primo (a scopo di test), lasciando il secondo ancora usando la variabile 'arguments'. Ciò ha causato a JSLint di aumentare l'errore rispetto a * entrambi i parametri: molto strano! – robyaw

1

Nella maggior parte situazione s si sarebbe meglio solo facendo:

function(a, b, option) { 
    option = option || "some default value"; 
    // ... 
} 

o

function(a, b, option) { 
    if (!option || typeof option !== 'string') { 
     option = "some default value"; 
    } 
    // ... 
}