Почему этот оператор распространения разбивает среду выполнения?
Должен быть лучший способ спросить это, но я просто не уверен в точной причине.
Сначала приведу фрагмент кода, через минуту я его разберу.
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;
};