Fungsi Javascript dan parameter default, tidak berfungsi di IE dan Chrome

101

Saya membuat fungsi seperti ini:

function saveItem(andClose = false) {

}

Ini berfungsi dengan baik di Firefox

Di IE memberikan kesalahan ini di konsol: Expected ')'

Di Chrome, ini memberikan kesalahan ini di konsol: Uncaught SyntaxError: Unexpected token =

Kedua browser menandai sumber kesalahan sebagai baris pembuatan fungsi.

Cakar
sumber
Peramban stok Android 5.1.1 di sini, masalah yang sama.
jc

Jawaban:

149

Anda tidak dapat melakukan ini, tetapi Anda dapat melakukan sesuatu seperti:

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

Ini sering disingkat menjadi seperti:

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

Memperbarui

Di atas benar untuk ECMAScript <= 5. ES6 telah mengusulkan parameter Default . Jadi di atas malah bisa dibaca:

function setName(name = 'Bob') {}
juco
sumber
14
Ini berguna untuk IE11 dan yang lebih lama, yang tidak mengimplementasikan ES6 dan merusak parameter default.
Eran Goldin
2
Terima kasih!! Tidak tahu itu! IE menyebalkan tetapi pengembang tidak punya pilihan selain mendukung browser "non".
Fr0zenFyr
4
name = name || 'Bob';tidak boleh digunakan karena jika nama disetel ke nilai falsey, default akan digunakan sebagai pengganti nama
Gerard Simpson
8
Alih-alih name = name || 'Bob'digunakan name = (name === undefined) ? '' : name;
Brian
1
@juco Saya tidak mengerti "Anda tidak bisa melakukan ini" - Mozilla MDN bilang kita bisa? developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/… Apakah Anda hanya mengatakan bahwa Anda tidak dapat melakukannya di IE atau Anda mengatakan dokumen Mozilla tidak akurat?
php-b-grader
13

Itu bukan sintaks ECMAScript yang valid, tetapi sintaks yang valid untuk superset fitur Mozilla yang mereka tambahkan ke implementasi bahasa mereka.

Sintaks penetapan parameter default kemungkinan besar ada di ECMAScript 6.

sistem
sumber
1
Oke, jadi apa cara terbaik untuk mengatur nilai default dalam fungsi Javascript?
Talon
1
@Talon: Cara terbaik tergantung pada situasi Anda. Jika Anda tahu argumennya tidak akan salah, Anda bisa melakukannya foo = foo || "the default". Atau Anda dapat memeriksa .lengthdari argumentsobjek. Atau Anda cukup menguji setiap parameter undefined. Ada berbagai kesempatan untuk menggunakan masing-masing.
sistem
8

Javascript tidak mengizinkan penentu "default".

Cara cepat untuk melakukan apa yang Anda inginkan adalah dengan mengubah:

function saveItem(andClose = false) {

}

sebagai berikut:

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
sumber
1
itu akan disetel andCloseke salah itu 0 ... tidak seperti yang saya harapkan ...
gdoron mendukung Monica
@gdoron lihat ini: stackoverflow.com/questions/7615214/… ini adalah kebiasaan yang perlu Anda pelajari tentang bahasa apa pun yang Anda gunakan.
JRomero
alternatifnya adalah dengan mengubah baris ketiga menjadi var andClose = andClose === undefined? false: andClose;Itu akan memungkinkan Anda untuk meneruskan 0ke fungsi dan tidak menggantinya dengan false.
Max Heiber
2

Kode yang Anda berikan tidak akan berjalan di Chrome <versi 49: https://kangax.github.io/compat-table/es6/#test-default_function_parameters

Anda menggunakan sintaks ECMAScript 2015 yang valid:

Menurut pendapat saya, cara terbaik untuk menggunakan fitur ES2015 adalah menggabungkan aset dengan Browserify atau WebPack , dengan langkah menggunakan Babel untuk melakukan trans-compile ES2015 ke ES5. Dengan begitu Anda tidak perlu khawatir tentang bagan kompatibilitas browser ES2015 itu. Ini menyakitkan untuk memulai pertama kali, tetapi sepadan.

Max Heiber
sumber
0

Dalam kasus Anda, Anda memiliki alternatif lain untuk memastikan bahwa variabel Anda adalah boolean:

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

Nilai defaultnya adalah undefined, dan true == undefined=> false, jadi nilai default Anda adalah false:)

Cédric Talpaert
sumber
Satu penyesuaian kecil adalah menghapus deklarasi var karena andClosevariabel sudah ditetapkan dalam cakupan ini
Ben Sewards