2013-03-02 7 views
32

stworzyłem funkcję tak:Javascript Funkcje i parametry domyślne, nie działa w IE i Chrome

function saveItem(andClose = false) { 

} 

to działa dobrze w Firefox

W IE daje ten błąd w konsoli: Expected ')'

W Chrome daje ten błąd w konsoli: Uncaught SyntaxError: Unexpected token =

Obie przeglądarki zaznaczają źródło błędu jako linię tworzenia funkcji.

+0

Przeglądarka zasobów Android 5.1.1 tutaj, ten sam problem. –

Odpowiedz

8

To nie jest poprawna składnia języka ECMAScript, ale jest poprawną składnią dla zbioru składników Mozilli dodawanych do implementacji języka.

Domyślne przypisanie parametr jest składnia prawdopodobne najbliższych ECMAScript 6.

+0

OK, więc jaki jest najlepszy sposób na ustawienie wartości domyślnych w funkcjach JavaScript? – Talon

+1

@Talon: Najlepszy sposób zależy od Twojej sytuacji.Jeśli wiesz, że argument nie będzie falsey, możesz zrobić 'foo = foo || "domyślny" '. Lub możesz sprawdzić '.length' obiektu' arguments'. Możesz też po prostu przetestować każdy parametr pod kątem "undefined". Są różne okazje do korzystania z każdego. –

53

Nie możesz tego zrobić, ale można zamiast zrobić coś takiego:

function saveItem(andClose) { 
    if(addClose === undefined) { 
     addClose = false; 
    } 
} 

ta jest często skracane do czegoś podobnego :

function setName(name) { 
    name = name || 'Bob'; 
} 

Aktualizacja

Powyższe odnosi się do ECMAScript < = 5. ES6 zaproponował Default parameters. Tak więc powyższe może zamiast tego przeczytać:

function setName(name = 'Bob') {} 
+6

Jest to użyteczne w IE11 i under, które nie implementują ES6 i łamią domyślne parametry. –

+0

Dzięki! Nie wiedziałem tego! IE jest do bani, ale programiści nie mają wyboru poza obsługą "non" -browser. – Fr0zenFyr

+1

'name = nazwa || "Bob"; 'nie powinno być używane, ponieważ jeśli nazwa ma wartość falsey, zamiast nazwy zostanie użyta wartość domyślna –

4

Javascript nie zezwala na "domyślny" specyfikator.

Szybkim sposobem robić to, co chcesz się zmienia:

function saveItem(andClose = false) { 

} 

na następujące kwestie:

function saveItem(andClose) { 
    // this line will check if the argument is undefined, null, or false 
    // if so set it to false, otherwise set it to it's original value 
    var andClose = andClose || false; 

    // now you can safely use andClose 
    if (andClose) { 
     // do something 
    } 
} 
+1

ustawi' andClose' na false, co oznacza 0 ... nie do końca, co bym oczekiwał ... – gdoron

+0

@gdoron zobacz: http://stackoverflow.com/questions/7615214/in-javascript-why-is-0-equal-to-false-but-not-false-by-itself Są to dziwactwa, których potrzebujesz, aby dowiedzieć się o dowolnym języku, którego używasz. – JRomero

+0

Alternatywą jest zmiana trzeciej linii na 'var iClose = andClose === undefined? false: andClose; 'To pozwoli ci przekazać' 0' do funkcji i nie zastąpić jej 'false'. –

1

Kod podałeś nie będzie działać w Chrome < wersji 49: https://kangax.github.io/compat-table/es6/#test-default_function_parameters

Użyłeś prawidłowej składni ECMAScript 2015:

Moim zdaniem, najlepszym sposobem użycia ES2015 wyposażony jest pakiet aktywów z Browserify lub WebPack, z krokiem do korzystania Babel do trans-kompilacji ES2015 do ES5. W ten sposób nie musisz się martwić o ten wykres kompatybilności przeglądarek ES2015. Rozpoczęcie gry po raz pierwszy jest bolesne, ale warto.

Powiązane problemy