Функции Javascript и параметры по умолчанию, не работающие в IE и Chrome

101

Я создал такую ​​функцию:

function saveItem(andClose = false) {

}

Он отлично работает в Firefox

В IE он выдает эту ошибку на консоли: Expected ')'

В Chrome выдает эту ошибку в консоли: Uncaught SyntaxError: Unexpected token =

Оба браузера отмечают источник ошибки как строку создания функции.

Talon
источник
Стандартный Android-браузер 5.1.1 здесь, та же проблема.
jc

Ответы:

152

Вы не можете этого сделать, но вместо этого можете сделать что-то вроде:

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

Это часто сокращается до примерно следующего:

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

Обновить

Сказанное выше верно для ECMAScript <= 5. ES6 предлагает параметры по умолчанию . Таким образом, вместо этого можно было бы читать:

function setName(name = 'Bob') {}
Juco
источник
14
Это полезно для IE11 и ниже, который не реализует ES6 и нарушает параметры по умолчанию.
Эран Голдин
2
Спасибо!! Не знал этого! IE - отстой, но у разработчиков нет другого выбора, кроме как поддерживать "не" -браузер.
Fr0zenFyr
4
name = name || 'Bob';не следует использовать, потому что если для name установлено значение falsey, вместо name будет использоваться значение по умолчанию
Джерард Симпсон
10
Вместо name = name || 'Bob'использования name = (name === undefined) ? '' : name;
Брайан
1
@juco Я не понимаю «Вы не можете этого сделать» - Mozilla MDN говорит, что мы можем? developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/ ... Вы просто говорите, что не можете сделать это в IE, или что документы Mozilla неточны?
php-b-grader
13

Это недопустимый синтаксис ECMAScript, но это допустимый синтаксис для расширенного набора функций Mozilla, которые они добавляют в свою реализацию языка.

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

система
источник
1
Итак, как лучше всего установить значения по умолчанию в функциях Javascript?
Talon
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
    }
}
JRomero
источник
1
будет установлено andCloseзначение false, это было 0 ... не совсем то, что я ожидал от него ...
gdoron поддерживает Монику
@gdoron см. это: stackoverflow.com/questions/7615214/… это те особенности, которые вам нужно знать о любом используемом вами языке.
JRomero 03
альтернативой является изменение третьей строки на. 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 с шагом для использования Babel для транс-компиляции ES2015 в ES5. Таким образом, вам не придется беспокоиться о диаграмме совместимости браузера ES2015. Больно начинать с первого раза, но оно того стоит.

Макс Хейбер
источник
0

В вашем случае у вас есть другая альтернатива, чтобы убедиться, что ваша переменная является логической:

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

Значение по умолчанию undefined, и true == undefined=> false, поэтому значение по умолчанию будет false:)

Седрик Тальпарт
источник
Одна небольшая корректировка заключается в удалении объявления var, поскольку andCloseпеременная уже назначена в этой области
Бен Сьюардс,