2012-02-21 14 views
6

Todos,JSLint - ¿No se cambia el parámetro <x> cuando se usan 'argumentos'?

Uso JSLint para validar mis archivos JS. En mi más reciente proyecto, estoy usando el siguiente formato para establecer los valores predeterminados para un número de funciones de JavaScript (más detallada here):

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

Sin embargo, esto hace que la última versión de JSLint para producir el siguiente error:

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

soy consciente de que usando el método más común para valores predeterminados de la asignación (es decir, option = option || {};) suprime el error; sin embargo, esto producirá un comportamiento incorrecto si tengo la intención de pasar un valor de falsey a option.

¿La única solución a este problema es introducir una nueva variable? ej .:

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

Una variable local, que es su "introducir un segundo parámetro" es una solución mejor. – Biswanath

Respuesta

6

supongo JSLint le advierte desde intenta modificar uno de los argumentos de entrada mediante el uso de un cheque con la palabra clave argumentos. JSHint, sin embargo, me da alguna advertencia al intentar tu código.

una solución a su problema sería la de comprobar si se ha definido o no option, de esa manera vas por el problema con el envío de los valores Falsy:

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

Si usted encuentra que es engorroso para escribir este typeof cheque cada vez, crear una función isDef:

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

// A. Simon

+0

Gracias por la sugerencia: eliminar el riesgo de especificar un valor incorrecto para 'arguments.length' es una gran ventaja. Desafortunadamente, el uso de este método hace que JSLint produzca el mismo error. – robyaw

+0

¿Estás seguro? JSLint no se queja cuando ejecuto los dos fragmentos de código anteriores. –

+0

Resulta que ambos podemos estar en lo cierto, dependiendo de la situación. En mi código, tengo una función con dos parámetros que requieren establecer valores predeterminados. Estaba usando su solución solo en la primera (para fines de prueba), dejando la segunda todavía usando la variable 'arguments'. Esto causó que JSLint aumentara el error contra los parámetros * both * - ¡muy extraño! – robyaw

1

En la mayoría de situación s que sería mejor simplemente haciendo:

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

o

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