Funkcje JavaScript i parametry domyślne, nie działają w IE i Chrome

101

Utworzyłem taką funkcję:

function saveItem(andClose = false) {

}

Działa dobrze w przeglądarce Firefox

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

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

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

Talon
źródło
Przeglądarka zapasów Androida 5.1.1 tutaj, ten sam problem.
jc

Odpowiedzi:

152

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

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

Często jest to skracane do czegoś takiego:

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

Aktualizacja

Powyższe dotyczy ECMAScript <= 5. ES6 zaproponował parametry domyślne . Więc powyższe mogłoby zamiast tego przeczytać:

function setName(name = 'Bob') {}
juco
źródło
14
Jest to przydatne dla IE11 i starszych, które nie implementują ES6 i przerywają domyślne parametry.
Eran Goldin,
2
Dzięki!! Nie wiedziałem tego! IE jest do bani, ale programiści nie mają innego wyboru niż obsługa przeglądarki „innej niż”.
Fr0zenFyr
4
name = name || 'Bob';nie powinno być używane, ponieważ jeśli nazwa jest ustawiona na wartość falsey, zamiast nazwy zostanie użyta wartość domyślna
Gerard Simpson
9
Zamiast name = name || 'Bob'używać name = (name === undefined) ? '' : name;
Brian
1
@juco Nie rozumiem „Nie możesz tego zrobić” - Mozilla MDN mówi, że możemy? developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/ ... Czy po prostu mówisz, że nie możesz tego zrobić w IE, czy też twierdzisz, że dokumenty Mozilli są niedokładne?
php-b-grader
13

To nie jest poprawna składnia ECMAScript, ale jest to poprawna składnia dla nadzbioru funkcji Mozilli, które dodają do swojej implementacji języka.

Domyślna składnia przypisania parametrów prawdopodobnie pojawi się w ECMAScript 6.

system
źródło
1
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 się nie uda, możesz to zrobić foo = foo || "the default". Czy można sprawdzić .lengthna argumentsobiekcie. Lub możesz po prostu przetestować każdy parametr undefined. Istnieją różne okazje do wykorzystania każdego z nich.
system
8

JavaScript nie zezwala na użycie „domyślnego” specyfikatora.

Szybkim sposobem robienia tego, co chcesz, jest zmiana:

function saveItem(andClose = false) {

}

do następujących:

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
    }
}
JRomero
źródło
1
będzie ustawione andClosena fałsz, było 0 ... nie do końca to, czego bym się spodziewał ...
gdoron wspiera Monikę
@gdoron zobacz: stackoverflow.com/questions/7615214/ ... to są dziwactwa, których musisz się nauczyć o każdym języku, którego używasz.
JRomero
alternatywą jest zmiana trzeciej linii na var andClose = andClose === undefined? false: andClose;To pozwoli ci przejść 0do funkcji i nie zastępować jej false.
Max Heiber
2

Podany kod nie będzie działać w Chrome <wersja 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 korzystania z funkcji ES2015 jest łączenie zasobów z przeglądarką lub WebPack , z krokiem umożliwiającym użycie Babel do przekształcenia ES2015 na ES5. W ten sposób nie musisz się martwić o tabelę zgodności przeglądarek ES2015. Rozpoczęcie pierwszego razu jest trudne, ale warto.

Max Heiber
źródło
0

W Twoim przypadku masz inną alternatywę, aby upewnić się, że zmienna jest wartością logiczną:

function saveItem(andClose) {
  var andClose = true == andClose;
  // ...
}

Wartość domyślna to undefinedi true == undefined=> false, więc domyślną wartością będzie false:)

Cédric Talpaert
źródło
Jedną drobną poprawką byłoby usunięcie deklaracji var, ponieważ andClosezmienna jest już przypisana w tym zakresie
Ben Sewards