2013-03-02 13 views
32

habe ich eine Funktion wie folgt aus:JavaScript-Funktionen und Standardparameter, nicht in IE und Chrome arbeiten

function saveItem(andClose = false) { 

} 

Es funktioniert gut in Firefox

In 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.

+0

Android Stock Browser 5.1.1 hier, gleiche Ausgabe. –

Antwort

8

Das ist keine gültige ECMAScript-Syntax, aber es ist eine gültige Syntax für Mozillas Obermenge von Funktionen, die sie zu ihrer Implementierung der Sprache hinzufügen.

Standard Parametrierung Syntax kommt, ist wahrscheinlich in ECMAScript 6.

+0

Ok, was ist der beste Weg, um Standardwerte in Javascript-Funktionen zu setzen? – Talon

+1

@Talon: Der beste Weg hängt von Ihrer Situation ab.Wenn Sie wissen, dass das Argument nicht falsch ist, können Sie 'foo = foo || tun "der Standard" '. Oder Sie können die '.length' des' arguments' Objektes überprüfen. Oder Sie können einfach jeden Parameter für "undefined" testen. Es gibt verschiedene Gelegenheiten, um jedes zu verwenden. –

53

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

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

Diese oft etwas verkürzt wird, wie :

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

aktualisieren

Das obige gilt für ECMAScript < = 5. ES6 hat Default parameters vorgeschlagen. So könnte das oben stattdessen lesen:

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

Dies ist nützlich für IE11 und unter, die ES6 nicht implementiert und Standardparameter bricht. –

+0

Danke !! Wusste das nicht! IE saugt, aber Entwickler haben keine andere Wahl, als einen "Nicht" -Browser zu unterstützen. – Fr0zenFyr

+1

'Name = Name || 'Bob'; 'sollte nicht verwendet werden, da wenn name auf einen falschen Wert gesetzt ist, der Standard anstelle des Namens –

4

Javascript lässt einen "Standard" Spezifizierer nicht zu.

Eine schnelle Art und Weise zu tun, was Sie wollen verändert:

function saveItem(andClose = false) { 

} 

auf die folgenden:

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

es wird gesetzt' andClose' zu ​​false es war 0 ... nicht ganz das, was ich erwarten würde ... – gdoron

+0

@gdoron siehe dies: http://stackoverflow.com/questions/7615214/in-javascript-why-is-0-equal-to-false-but-not-false-by-self Dies sind die Macken, die Sie über jede Sprache lernen müssen, die Sie verwenden. – JRomero

+0

Eine Alternative ist, die dritte Zeile in 'var andClose = andClose === undefined zu ändern? false: andClose; 'Dadurch können Sie" 0 "an die Funktion übergeben und nicht durch" false "ersetzen. –

1

Der Code wurde nicht in Chrome < Version 49 zur Verfügung gestellt wird 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 ist der beste Weg, ES2015 Funktion zu nutzen ist Vermögen mit Browserify oder WebPack, mit einem Schritt zu bündeln für die Verwendung von Babel zu trans kompilieren ES2015 zu ES5. Auf diese Weise müssen Sie sich nicht um das Browser-Kompatibilitätsdiagramm für ES2015 sorgen. Es ist ein Schmerz, um das erste Mal zu beginnen, aber es lohnt sich.

Verwandte Themen