Javascript İşlevleri ve varsayılan parametreler, IE ve Chrome'da çalışmıyor


104

Bunun gibi bir işlev oluşturdum:

function saveItem(andClose = false) {

}

Firefox'ta iyi çalışıyor

IE'de konsolda şu hatayı verir: Expected ')'

Chrome'da konsolda şu hatayı veriyor: Uncaught SyntaxError: Unexpected token =

Her iki tarayıcı da hatanın kaynağını işlev oluşturma satırı olarak işaretler.


Android hisse senedi tarayıcısı 5.1.1 burada, aynı sorun.
jc

Yanıtlar:


156

Bunu yapamazsınız, ancak bunun yerine şöyle bir şey yapabilirsiniz:

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

Bu genellikle şu şekilde kısaltılır:

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

Güncelleme

Yukarıdakiler ECMAScript <= 5 için geçerlidir. ES6, Varsayılan parametreler önermiştir . Yani yukarıdakiler bunun yerine şöyle olabilir:

function setName(name = 'Bob') {}

14
Bu, ES6 uygulamayan ve varsayılan parametrelerde kesinti yapan IE11 ve altı için kullanışlıdır.
Eran Goldin

2
Teşekkürler!! Bunu bilmiyordum! IE berbat ama geliştiricilerin "olmayan" bir tarayıcıyı desteklemekten başka seçeneği yok.
Fr0zenFyr

4
name = name || 'Bob';kullanılmamalıdır çünkü ad yanlış bir değere ayarlanırsa, ad yerine varsayılan değer kullanılacaktır
Gerard Simpson

10
Yerine name = name || 'Bob'kullanımı name = (name === undefined) ? '' : name;
Brian

1
@juco "Bunu yapamazsın" anlamıyorum - Mozilla MDN yapabileceğimizi söylüyor? developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/… Sadece bunu IE'de yapamayacağınızı mı söylüyorsunuz yoksa Mozilla belgelerinin yanlış olduğunu mu söylüyorsunuz?
php-b-grader

14

Bu geçerli bir ECMAScript sözdizimi değil, ancak Mozilla'nın dil uygulamalarına ekledikleri üst özellikler kümesi için geçerli bir sözdizimidir.

Varsayılan parametre atama sözdizimi büyük olasılıkla ECMAScript 6'da geliyor.


1
Peki, Javascript işlevlerinde varsayılan değerleri ayarlamanın en iyi yolu nedir?
Talon

1
@Talon: En iyi yol, durumunuza bağlıdır. Tartışmanın yanlış olmayacağını biliyorsanız, yapabilirsiniz foo = foo || "the default". Yoksa kontrol edebilirsiniz .lengthait argumentsnesne. Veya her bir parametreyi için test edebilirsiniz undefined. Her birini kullanmak için farklı durumlar vardır.
sistem

8

Javascript, "varsayılan" bir tanımlayıcıya izin vermez.

İstediğiniz şeyi yapmanın hızlı bir yolu değişmektir:

function saveItem(andClose = false) {

}

şu şekilde:

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
andClosefalse olarak ayarlanacak , 0 ... tam olarak beklediğim gibi değil ...
gdoron Monica'yı

@gdoron buna bakın: stackoverflow.com/questions/7615214/… bunlar, kullandığınız herhangi bir dil hakkında öğrenmeniz gereken tuhaflıklardır.
JRomero

bir alternatif, üçüncü satırı var andClose = andClose === undefined? false: andClose;Bu olarak değiştirmektir 0, işleve geçmenizi ve onun ile değiştirilmemesini sağlar false.
Max Heiber

2

Sağladığınız kod Chrome <sürüm 49: https://kangax.github.io/compat-table/es6/#test-default_function_parameters'da çalışmayacak

Geçerli ECMAScript 2015 sözdizimi kullandınız:

Bence, ES2015 özellikleri kullanmak için en iyi yolu ile varlıklarını paket etmektir Browserify veya WebPack kullanmak için bir adım ile, Babel ES5 için trans-derleme ES2015 için. Bu şekilde, ES2015 tarayıcı uyum tablosu hakkında endişelenmenize gerek kalmaz. İlk seferde başlamak bir acı, ama buna değer.


1

Sizin durumunuzda, değişkeninizin bir boole olduğundan emin olmak için başka bir alternatifiniz var:

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

Varsayılan değer undefined, ve true == undefined=> şeklindedir false, bu nedenle varsayılan değeriniz false:)


Olarak bir küçük düzeltme var beyanı kaldırmak olacağını andClosedeğişken zaten bu kapsamda atanan
Ben Sewards

Bunun bir boole olduğundan ve 'true' dizesi olmadığından gerçekten emin olmak istiyorsanız, bunuandClose = true === andClose;
Ocak

İkiniz de haklısınız :)
Cédric Talpaert
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.