Как преобразовать функцию iife old ways в функцию со стрелкой в одной строке

#javascript #iife

#javascript #iife

Вопрос:

как бы вы преобразовали:

 (function(age) {return `your ${age}`;
})(10);
 

в функцию со стрелкой? Я пытался, но не работает:

 (const years = (age) => `your ${age}`)(10);
 

Почему не работает, и если это из-за const ?

А затем еще один пример, если я сделаю:

 const marco= { name: 'marco ccc',
  say hi: function () {
  return 'something';
  }
}
 

как мне преобразовать SayHi в функцию со стрелкой?

Комментарии:

1. Зачем пытаться назвать функцию со стрелкой? Вы не делаете этого в версии iife.

2. Почему вы хотите это сделать? Особенно в случае метода object? На самом деле это не имеет смысла.

3. console.log(((возраст) => ваш возраст равен $ {возраст}) (10));

4. я пытаюсь понять, как правильно преобразовать выражение вызываемой функции с помощью функции со стрелкой, а затем снова преобразовать функцию объекта в функцию со стрелкой. Изучать и тестировать, я знаю, не имеет смысла

5. const marco = {SayHi: () => ‘something’, имя: ‘marco’ };

Ответ №1:

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

 (async (arg1,arg2) => {
  console.log(arg1,arg2); // logs a,b
})('a','b');
 

Это избавляет меня от создания const , а затем вызова его, например:

 const outerFunc = () => {

   // ... some code

   const innerFunc = async () => {
      // I can use await in here
   };
   innerFunc();
}
 

и вместо этого я делаю это:

 const outerFunc = () => {

   // ... some code

   (async () => {
      // I can use await in here
   })();
}
 

Чтобы просто создать замыкание, оставьте асинхронную часть

 ((...args) => console.log(...args))('a','b');
 

РЕДАКТИРОВАТЬ: если вы внимательно посмотрите на приведенное выше, вы увидите, что оно фактически сокращается до

 (console.log)('a','b')
 

Ответ №2:

Выражения присваиваются переменным. Функции со стрелкой обычно состоят из 2 частей: переменной, которой она назначена, и тела, например:

 const foo = () => { ... }
// ^ variable
            ^^^^ function body
 

Инициализация переменных может быть выполнена только в виде инструкции в отдельной строке; const они не могут быть заключены в круглые скобки. Вам просто нужно отделить переменную, которой присваивается возвращаемое значение (тело функции и вызов функции):

 const years = ((age) => `your ${age}`)(10);
//             ^^^^^^^^^^^^^^^^^^^^^^
//             this is the function body
//             that needs to be invoked immediately
//                                     ^^ with the (10)
//    ^^^^^    with the result assigned to `years`
console.log(years); 

В объекте просто замените function() на () => (и обратите внимание, что say hi это недопустимое свойство объекта в литерале объекта — либо заключите его в кавычки, либо используйте вместо него одно слово):

 const marco = {
  name: 'marco ccc',
  sayHi: () => {
    return 'something';
  }
};

console.log(marco.sayHi()); 

Комментарии:

1. Но в моем случае мне было интересно, как мое немедленно вызванное выражение функции будет преобразовано с помощью функции со стрелкой. Другой пример, который заставляет меня задуматься, есть ли у меня что-то вроде: const marco= { name: ‘marco ccc’ say hi: function () { return ‘something’} } Таким образом, чтобы я мог вызвать marco.SayHi(); Как я могу сделать SayHi() в качестве функции со стрелкой?

2.Это функция со (age) => `your ${age}` стрелкой. Нажмите «Выполнить фрагмент кода», чтобы увидеть, как он работает. Но const marco= { name: 'marco ccc' say hi: function () {} } из вашего комментария недопустимый синтаксис. Вы имели в виду const marco= { name: 'marco ccc', sayHi: function () {} } ? Затем используйте const marco= { name: 'marco ccc', sayHi: () => {} }

3. Извините, что я виноват, но для немедленного вызова (age) => your ${age} может быть что-то вроде ((age) => your ${age} )(10); и если да, то почему const не используется?

4. Если вы хотите использовать результат вызова, независимо от того, используете ли вы функцию со стрелкой или a function , вам нужно присвоить ее переменной (или сделать с ней что-то еще). Например const years = (function(age) {return `your ${age}`;})(10); , эквивалентно const years = ((age) => `your ${age}`)(10); .

5. но в чем тогда смысл IIFE? выбираю ли я: console.log(((возраст) => ваш возраст равен $ {возраст}) (10)); или const years = ((возраст) => your ${age} )(10);

Ответ №3:

Итак, в основном я хотел преобразовать эти две функции (старую версию):

 (function(age) {return `your ${age}`;
})(10);
 

и

 const marco= { name: 'marco ccc',
  say hi: function () {
  return 'something';
  }
}

console.log(marco.sayHi());
 

Которые преобразованы соответственно:

 ((age) => your age is ${age})(10);
 

и

 const marco= { name: 'marco ccc', sayHi: () => {} }
 

Но, кроме того, я пытался понять преимущества IIFE, например:

 const years = ((age) => your ${age})(10); 
 

это более короткая версия, чем что-то вроде:

 const years = (age) => your ${age}; 
const whatever = years(10); 
console.log(whatever);
 

Комментарии:

1. У iife есть два преимущества, если вы не используете его для создания асинхронного замыкания внутри неасинхронной функции, тогда есть только одно — для создания замыкания. И, честно говоря, преимущества создания замыкания с использованием iife в современном JavaScript в значительной степени (не полностью, но в значительной степени) смягчаются let , хотя вы можете видеть, что iife используется по стилистическим соображениям, не создавайте iife, если вы не уверены, что он вам нужен. Если вы не уверены, нужна ли она вам, она вам не нужна.