Функції Javascript та параметри за замовчуванням, не працюють в IE та Chrome


101

Я створив таку функцію:

function saveItem(andClose = false) {

}

Він чудово працює у Firefox

У IE він видає цю помилку на консолі: Expected ')'

У Chrome він видає цю помилку в консолі: Uncaught SyntaxError: Unexpected token =

Обидва браузери позначають джерело помилки як рядок створення функції.


Тут Android браузер 5.1.1, та сама проблема.
jc

Відповіді:


149

Ви не можете цього зробити, але натомість можете зробити щось на кшталт:

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

Це часто скорочується до чогось типу:

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

Оновлення

Вищезазначене справедливо для ECMAScript <= 5. ES6 запропонував параметри за замовчуванням . Тож вище можна було прочитати:

function setName(name = 'Bob') {}

14
Це корисно для IE11 і нижче, який не реалізує ES6 та перерви за типовими параметрами.
Еран Голдін

2
Дякую!! Не знав цього! IE відстійний, але розробники не мають іншого вибору, ніж підтримувати "не" -продавця.
Fr0zenFyr

4
name = name || 'Bob';не слід використовувати, оскільки якщо для імені встановлено значення фальси, замість імені буде використано за замовчуванням
Джерард Сімпсон

8
Замість name = name || 'Bob'використання name = (name === undefined) ? '' : name;
Брайан

1
@juco Я не розумію "Ви не можете цього зробити" - Mozilla MDN каже, що ми можемо? developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/… Ви просто говорите, що не можете зробити це в IE або ви говорите, що документи Mozilla неточні?
php-b-грейдер

13

Це не допустимий синтаксис ECMAScript, але це допустимий синтаксис для набору функцій Mozilla, які вони додають до своєї реалізації мови.

Синтаксис призначення параметрів за замовчуванням, ймовірно, міститься в ECMAScript 6.


1
Гаразд, який найкращий спосіб встановити значення за замовчуванням у функціях Javascript?
Талон

1
@Talon: Найкращий спосіб залежить від вашої ситуації. Якщо ви знаєте, що аргумент не буде фальсифікувати, ви можете зробити foo = foo || "the default". Або ви можете перевірити .lengthна argumentsоб'єкті. Або ви можете просто протестувати кожен параметр для undefined. Існують різні випадки використання кожного.
система

8

Javascript не дає специфікатора "за замовчуванням".

Швидкий спосіб зробити те, що ви хочете, змінюється:

function saveItem(andClose = false) {

}

до наступного:

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
це встановить andCloseзначення false, це було 0 ... не зовсім те, що я б очікував, що це зробить ...
gdoron підтримує Моніку

@gdoron побачити це: stackoverflow.com/questions/7615214 / ... ці примхи ви повинні дізнатися про яке - або мовою , який ви використовуєте.
JRomero

Альтернатива - змінити третій рядок на var andClose = andClose === undefined? false: andClose;Це дозволить вам перейти 0до функції, а не замінити її на false.
Макс Хайбер

2

Наданий вами код не запускається в Chrome <версія 49: https://kangax.github.io/compat-table/es6/#test-default_function_parameters

Ви використовували дійсний синтаксис ECMAScript 2015:

На мій погляд, кращий спосіб використовувати ES2015 Особливо це об'єднання активів з Browserify або WebPack , з кроком для використання Бабеля в транс-компіляції ES2015 в ES5. Таким чином, вам не потрібно турбуватися про таку схему сумісності браузера ES2015. Боляче почати з першого разу, але варто того.


0

У вашому випадку у вас є інша альтернатива, щоб бути впевненою, що ваша змінна булева:

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

Значення за замовчуванням - undefinedі true == undefined=> false, тож ваше значення за замовчуванням буде false:)


Невеликим коригуванням буде видалення var-декларації, оскільки andCloseзмінна вже призначена в цій області
Ben Sewards
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.