#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, если вы не уверены, что он вам нужен. Если вы не уверены, нужна ли она вам, она вам не нужна.