Javascript-Funktionen und Standardparameter funktionieren nicht in IE und Chrome

101

Ich habe eine Funktion wie diese erstellt:

function saveItem(andClose = false) {

}

In Firefox funktioniert es einwandfrei

Im IE gibt es diesen Fehler auf der Konsole: Expected ')'

In Chrome gibt es diesen Fehler in der Konsole: Uncaught SyntaxError: Unexpected token =

Beide Browser markieren die Fehlerquelle als Funktionserstellungszeile.

Talon
quelle
Android Stock Browser 5.1.1 hier, gleiche Ausgabe.
JC

Antworten:

149

Sie können dies nicht tun, aber Sie können stattdessen etwas tun wie:

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

Dies wird oft verkürzt auf:

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

Aktualisieren

Dies gilt für ECMAScript <= 5. ES6 hat Standardparameter vorgeschlagen . Das Obige könnte also stattdessen lauten:

function setName(name = 'Bob') {}
Juco
quelle
14
Dies ist nützlich für IE11 und darunter, das ES6 nicht implementiert und bei Standardparametern nicht funktioniert.
Eran Goldin
2
Vielen Dank!! Wusste das nicht! IE ist scheiße, aber Entwickler haben keine andere Wahl, als einen "Nicht" -Browser zu unterstützen.
Fr0zenFyr
4
name = name || 'Bob';sollte nicht verwendet werden, da, wenn der Name auf einen Falsey-Wert gesetzt ist, der Standardwert anstelle des Namens verwendet wird
Gerard Simpson
8
Anstelle von name = name || 'Bob'Gebrauch name = (name === undefined) ? '' : name;
Brian
1
@juco Ich verstehe nicht "Sie können das nicht tun" - Mozilla MDN sagt, wir können? developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/… Wollen Sie damit nur sagen, dass Sie dies im IE nicht tun können, oder sagen Sie, dass die Mozilla-Dokumente ungenau sind?
PHP-B-Grader
13

Dies ist keine gültige ECMAScript-Syntax, aber eine gültige Syntax für Mozillas Obermenge an Funktionen, die sie zur Implementierung der Sprache hinzufügen.

Die Standard-Syntax für die Parameterzuweisung wird wahrscheinlich in ECMAScript 6 verwendet.

das System
quelle
1
Ok, wie lassen sich Standardwerte in Javascript-Funktionen am besten festlegen?
Talon
1
@ Talon: Der beste Weg hängt von Ihrer Situation ab. Wenn Sie wissen, dass das Argument nicht falsch ist, können Sie es tun foo = foo || "the default". Oder Sie können .lengthdas argumentsObjekt überprüfen . Oder Sie können einfach jeden Parameter auf testen undefined. Es gibt verschiedene Gelegenheiten, um jede zu verwenden.
das System
8

Javascript erlaubt keinen "Standard" -Spezifizierer.

Eine schnelle Möglichkeit, das zu tun, was Sie möchten, besteht darin, Folgendes zu ändern:

function saveItem(andClose = false) {

}

Zu dem Folgendem:

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
quelle
1
es wird andCloseauf false gesetzt , es war 0 ... nicht ganz das, was ich erwarten würde ...
Gdoron unterstützt Monica am
@gdoron siehe dies: stackoverflow.com/questions/7615214/… Dies sind die Macken, die Sie benötigen, um etwas über jede Sprache zu lernen, die Sie verwenden.
JRomero
Eine Alternative besteht darin, die dritte Zeile in zu ändern. var andClose = andClose === undefined? false: andClose;Dadurch können Sie zur 0Funktion übergehen und diese nicht durch ersetzen lassen false.
Max Heiber
2

Der von Ihnen angegebene Code wird in Chrome <Version 49 nicht ausgeführt: https://kangax.github.io/compat-table/es6/#test-default_function_parameters

Sie haben eine gültige ECMAScript 2015-Syntax verwendet:

Meiner Meinung nach besteht die beste Möglichkeit, ES2015-Funktionen zu verwenden, darin, Assets mit Browserify oder WebPack zu bündeln. Mit Babel können Sie ES2015 auf ES5 transkompilieren. Auf diese Weise müssen Sie sich keine Gedanken über die Kompatibilitätstabelle des ES2015-Browsers machen. Es ist ein Schmerz, beim ersten Mal loszulegen, aber es lohnt sich.

Max Heiber
quelle
0

In Ihrem Fall haben Sie eine andere Alternative, um sicherzustellen, dass Ihre Variable ein Boolescher Wert ist:

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

Der Standardwert ist undefinedund true == undefined=> false, Ihr Standardwert ist also false:)

Cédric Talpaert
quelle
Eine geringfügige Anpassung wäre das Entfernen der var-Deklaration, da die andCloseVariable bereits in diesem Bereich zugewiesen ist
Ben Sewards