Почему этот оператор распространения разбивает среду выполнения?

Должен быть лучший способ спросить это, но я просто не уверен в точной причине.

Сначала приведу фрагмент кода, через минуту я его разберу.

this.argArr = [['arg1', 'arg2'], ['foo', 'bar'], ['you get ', 'the point']];

this.evalArgsFromArr = function () {
  var out = [];
  for (var _ = 0; _ < parent.argArr.length; _++) {
    out.push(someFunction(...parent.argArr[_])); // This part crashes
  }
  return out;
};

Эта функция, конечно, является частью объекта.

Идея заключается в том, что каждый элемент в parent.argArr должен быть массивом, содержащим два аргумента для someFunction(), что также удобно служит в качестве удобочитаемой информации о выходе. Насколько я понимаю, используется для повторяемого объекта (например, массивов, хранящихся в parent.argArr) оператор спреда выводит каждое отдельное значение отдельно. (Например, первый запуск for цикл должен выводить someFunction('arg1', 'arg2').)

Всякий раз, когда я запускаю файл, содержащий это в Node.js или PHP, среда выполнения почти сразу падает, несмотря на то, что он еще не вызывается, ссылаясь на оператор распространения [ ... ] как неожиданно.

Вот сообщение об ошибке, если оно помогает: Сообщение об ошибке

2 ответа

Я думаю, что это наказание за использование подчеркивания в качестве имени переменной. А если серьезно, глядя на ваш код, кажется, что он должен работать, но только если ваш интерпретатор Node достаточно новый, чтобы его поддерживать.

Чтобы увидеть поддержку оператора распространения в версиях Node, смотрите:

Чтобы использовать современный синтаксис на платформах, которые его не поддерживают, используйте Babel:

Конечно, мы не можем проверить это, потому что вы не предоставили работающий пример.

Но вы можете увидеть этот ответ:

и посмотрите, сможете ли вы запустить пример там. Он использует оператор распространения и если он проверен, чтобы работать правильно. Если он работает в вашей системе, вы можете использовать оператор распространения. Если этого не произойдет, вам следует обновить Node, потому что нет причин использовать такую ​​устаревшую версию.

Если ничего не помогает, вы всегда сможете изменить:

someFunction(...array);

чтобы:

someFunction.apply(undefined, array);

Смотрите документы:

Между прочим, я не уверен, что вы имеете в виду, говоря, что одна строка "любит сбой" - разве это не всегда сбой? Это было бы очень странно.

Вы должны удалить "...", попробуйте:

this.argArr = [['arg1', 'arg2'], ['foo', 'bar'], ['you get ', 'the point']];

this.evalArgsFromArr = function () {
  var out = [];
  for (var _ = 0; _ < parent.argArr.length; _++) {
    out.push(someFunction(parent.argArr[_]));
  }
  return out;
};
Другие вопросы по тегам