JSLint - Не изменяйте параметр <x>при использовании аргументов? - PullRequest
6 голосов
/ 21 февраля 2012

All

Я использую JSLint для проверки моих файлов JS. В моем последнем проекте я использую следующий формат для установки значений по умолчанию для ряда функций JavaScript (подробнее здесь ):

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

Это, однако, приводит к тому, что последняя сборка JSLint выдает следующую ошибку:

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

Мне известно, что использование более распространенного метода присвоения значений по умолчанию (т. Е. option = option || {};) подавляет ошибку; однако это приведет к некорректному поведению, если я собираюсь передать значение falsey в option.

Является ли единственным решением этой проблемы введение новой переменной? e.g.:

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

Ответы [ 2 ]

6 голосов
/ 21 февраля 2012

Полагаю, JSLint предупреждает вас, поскольку вы пытаетесь изменить один из входных аргументов, используя проверку с ключевым словом arguments. JSHint , однако, не дает мне никакого предупреждения при попытке вашего кода.

Решением вашей проблемы было бы проверить, определено ли option или нет, таким образом вы обходитепроблема с отправкой ложных значений:

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

Если вы обнаружите, что писать эту проверку typeof каждый раз неудобно, создайте функцию isDef:

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

//Саймон А.

1 голос
/ 21 мая 2012

В большинстве случаев вам лучше всего сделать:

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

или

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