2012-02-21 21 views
6

Wszystko,JSLint - Nie mutować parametru <x> podczas używania "argumentów"?

Używam JSLint do sprawdzania poprawności moich plików JS. W swoim najnowszym projekcie, używam następujący format, aby ustawić wartości domyślne dla wielu funkcji JavaScript (dalsze szczegółowe here):

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

To jednak powoduje, że najnowsza wersja JSLint produkować następujący błąd:

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

Zdaję sobie sprawę, że przy użyciu bardziej wspólnej metody przypisywania domyślnych (tj option = option || {};) supresses błąd; jednak spowoduje to nieprawidłowe zachowanie, jeśli zamierzam przekazać wartość falsey do option.

Czy jedynym rozwiązaniem tego problemu jest wprowadzenie nowej zmiennej? np .:

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

zmiennej lokalnej, która jest twój „wprowadzenie drugiego parametru” jest lepszym rozwiązaniem. – Biswanath

Odpowiedz

6

Chyba JSLint ostrzega, ponieważ starają się zmodyfikować jeden z argumentów wejściowych za pomocą czeku z kluczowych argumentów. JSHint, jednak daje mi jakieś ostrzeżenie podczas próby kodu.

Rozwiązaniem problemu byłoby sprawdzić czy option jest zdefiniowana lub nie, w ten sposób można obejść problem z wysłaniem wartości falsy:

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

Jeśli okaże się, że jest to uciążliwe do napisania tego typeof sprawdzić za każdym razem, tworzą isDef funkcję:

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

// Simon A.

+0

Dzięki za sugestię - usunięcie ryzyka podania nieprawidłowej wartości dla 'arguments.length' jest dużym plusem. Niestety, użycie tej metody powoduje, że JSLint generuje ten sam błąd. – robyaw

+0

Czy na pewno? JSLint nie narzeka, gdy uruchomię dwa powyższe fragmenty kodu. –

+0

Okazało się, że oboje możemy mieć rację, w zależności od sytuacji. W moim kodzie mam funkcję z dwoma parametrami wymagającymi ustawienia domyślnego. Używałem twojego rozwiązania tylko na pierwszym (dla celów testowych), pozostawiając drugie wciąż używając zmiennej 'arguments'. To spowodowało, że JSLint podniósł błąd w stosunku do * obu * parametrów - bardzo dziwne! – robyaw

1

W większości sytuacji s byłbyś lepiej po prostu robi:

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

lub

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