Почему нельзя использовать IIFE со стилем Дугласа Крокфорда, когда я переписываю его с помощью стрелки? - PullRequest
1 голос
/ 23 марта 2019

У меня есть IIFE, который работает, но когда я переписываю его с помощью функции стрелки, он не работает!

1.- Этот отлично работает:

let j = 3;

(function (n) {
  while (n--)
    console.log("n only", n);
}(j));

2.- Этот не работает!:

((n) => {
  while (n--)
    console.log("n only", n);
}(j));

3.- Я уже тестировал следующую версию, которая тоже работает:

((n) => {
  while (n--)
    console.log("n only", n);
})(j);

Но я очень хочу понять, почему не работает версия (2).

Ответы [ 3 ]

3 голосов
/ 23 марта 2019

Так определил язык.Поскольку mdn заявляет:

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

Он продолжает приводить еще один пример, но принцип тот же:

let callback;

callback = callback || function() {}; // ok

callback = callback || () => {};
// SyntaxError: invalid arrow-function arguments

callback = callback || (() => {});    // ok

Хотя Крокфорд предпочитает ставить закрывающую скобку IIFE вв самом конце (после аргументов) я лично считаю более интуитивно понятным поместить его в то же место, где это требуется для функций со стрелками (после закрывающей скобки, перед аргументами).

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

(function (n) => {
  while (n--)
    console.log("n only", n);
})(j);
1 голос
/ 23 марта 2019

Что такое, а что нет, синтаксис определяется языком грамматика .

A CallExpression определяется как

MemberExpression Arguments

Но ArrowFunction - это не MemberExpression, это AssignmentExpression.

Почему в таком случае это будет вопрос для комитета TC39.

0 голосов
/ 23 марта 2019

Оба работают, но вы сделали опечатку: обязательно напишите (<function def>)()

let a = 3;

((b) => {
  while(b--) console.log(b);
})(a);

(function(b){
  while(b--) console.log(b);
})(a);
...