Почему я не могу пропустить назначения параметров в сигнатуре функции?

С деструктуризацией массива можно отбрасывать ведущие элементы, вставляя запятые без предшествующей ссылки:

const [ , two ] = [ 1, 2 ]

То же самое не относится к сигнатурам функций - следующий код не будет проанализирован, потому что начальная запятая в сигнатуре является неожиданной:

function ditchFirstArgument( , second ){}

Почему мне нужно предоставлять ссылки на ведущие параметры в выражениях функций ES6?

3 ответа

Решение

Почему мне нужно предоставлять ссылки на ведущие параметры в выражениях функций ES6?

Потому что иначе это будет синтаксическая ошибка. Не только в ES6, но и в любой версии языка вы не можете исключить формальные параметры, потому что спецификация не предусматривает этого.

Если вы действительно хотите сделать это (но почему?), Вы можете написать это как

function ditchFirstArgument(...[, second]) {}

или, по крайней мере, вы сможете в какой-то будущей версии ES; см. https://github.com/tc39/ecma262/commit/d322357e6be95bc4bd3e03f5944a736aac55fa50. Кажется, это уже поддерживается в Chrome. Между тем, лучшее, что вы можете сделать, это

function ditchFirstArgument(...args) {
  const [, second] = args;

Но почему спецификация не позволяет выбрать параметры?

Вы должны спросить людей, которые написали это, но они, возможно, никогда даже не рассматривали это, или если бы они это сделали, отклонили это, потому что это подвержено ошибкам, вряд ли когда-либо необходимо, и их легко можно обойти, используя фиктивные формальные параметры, такие как _,

Понимание Романа из Go полезно, но неуместно для JS, где токен _ является допустимой ссылкой, обычно используемой библиотеками Underscore и более поздними Lodash.

Даже если это приемлемо, вам придется создавать и избегать ложных ссылок для каждого неиспользуемого аргумента, что не идеально.

Тем не менее, можно деструктурировать аргумент функции в пустой объект, который фактически обнуляет параметр без ссылки.

function take_third( {}, {}, third ){
  return third 
}

Я полагаю, что это обычная схема именования неиспользуемых переменных с подчеркиванием:

function ditchFirstArgument(_, second) { /* ... */ }

Хотя это не помешает вам на самом деле использовать эту переменную (как в Go), похоже, это довольно простой обходной путь.

Другие вопросы по тегам