Funzioni Javascript e parametri predefiniti, non funzionanti in IE e Chrome


101

Ho creato una funzione come questa:

function saveItem(andClose = false) {

}

Funziona bene in Firefox

In IE dà questo errore sulla console: Expected ')'

In Chrome dà questo errore nella console: Uncaught SyntaxError: Unexpected token =

Entrambi i browser contrassegnano l'origine dell'errore come riga di creazione della funzione.


Browser stock Android 5.1.1 qui, stesso problema.
jc

Risposte:


150

Non puoi farlo, ma puoi invece fare qualcosa come:

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

Questo è spesso abbreviato in qualcosa di simile:

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

Aggiornare

Quanto sopra è vero per ECMAScript <= 5. ES6 ha proposto parametri predefiniti . Quindi quanto sopra potrebbe invece leggere:

function setName(name = 'Bob') {}

14
Questo è utile per IE11 e versioni precedenti, che non implementa ES6 e interrompe i parametri predefiniti.
Eran Goldin

2
Grazie!! Non lo sapevo! IE fa schifo ma gli sviluppatori non hanno altra scelta che supportare un browser "non".
Fr0zenFyr

4
name = name || 'Bob';non dovrebbe essere usato perché se il nome è impostato su un valore falso, verrà utilizzato il valore predefinito al posto del nome
Gerard Simpson

8
Invece di name = name || 'Bob'usare name = (name === undefined) ? '' : name;
Brian

1
@juco Non capisco "Non puoi farlo" - Mozilla MDN dice che possiamo? developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/… Stai solo dicendo che non puoi farlo in IE o stai dicendo che i documenti di Mozilla sono imprecisi?
php-b-grader

13

Questa non è una sintassi ECMAScript valida, ma è una sintassi valida per il superset di funzionalità di Mozilla che aggiungono alla loro implementazione del linguaggio.

La sintassi di assegnazione dei parametri predefinita è probabilmente disponibile in ECMAScript 6.


1
Ok, quindi qual è il modo migliore per impostare i valori predefiniti nelle funzioni Javascript?
Talon

1
@ Talon: il modo migliore dipende dalla tua situazione. Se sai che l'argomento non sarà falso, puoi farlo foo = foo || "the default". Oppure puoi controllare .lengthil valore argumentsdell'oggetto. Oppure puoi semplicemente testare ogni parametro per undefined. Ci sono diverse occasioni per usarli.
il sistema

8

Javascript non consente uno specificatore "predefinito".

Un modo rapido per fare ciò che vorresti è cambiare:

function saveItem(andClose = false) {

}

a quanto segue:

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
sarà impostato andClosesu false era 0 ... non proprio quello che mi sarei aspettato che facesse ...
gdoron sta supportando Monica

@gdoron vedere questo: stackoverflow.com/questions/7615214/...~~V~~plural~~3rd queste sono le stranezze che dovete imparare qualsiasi lingua utilizzata.
JRomero

un'alternativa è cambiare la terza riga in var andClose = andClose === undefined? false: andClose;Ciò ti consentirà di passare 0alla funzione e non sostituirla con false.
Max Heiber

2

Il codice fornito non verrà eseguito in Chrome <versione 49: https://kangax.github.io/compat-table/es6/#test-default_function_parameters

Hai utilizzato una sintassi ECMAScript 2015 valida:

A mio parere, il modo migliore per utilizzare le funzionalità di ES2015 è raggruppare le risorse con Browserify o WebPack , con un passaggio per utilizzare Babel per trans-compilare ES2015 in ES5. In questo modo non devi preoccuparti della tabella di compatibilità del browser ES2015. È un dolore iniziare la prima volta, ma ne vale la pena.


0

Nel tuo caso, hai un'altra alternativa per assicurarti che la tua variabile sia un booleano:

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

Il valore predefinito è undefined, e true == undefined=> false, quindi il valore predefinito sarà false:)


Un piccolo aggiustamento potrebbe essere quello di rimuovere la dichiarazione var poiché la andClosevariabile è già assegnata in questo ambito
Ben Sewards,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.