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


101

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

function saveItem(andClose = false) {

}

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

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

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

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


Стандартный 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') {}

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
    }
}

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переменная уже назначена в этой области
Бен Сьюардс,
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.