Що саме робить функція анонімного JavaScript f => f?


101

Я використовую сторонню бібліотеку, яка має функцію, яка приймає функції як аргументи. Я роблю деякі умовні перевірки, щоб вирішити, чи потрібно додавати певну функцію в якості параметра, а в деяких випадках я не хочу надати функцію. Надання нуля в цих випадках призводить до помилки.

Я знайшов цей код, який працює, але я не повністю розумію, що відбувається.

compose(__DEV__ ? devTools() : f => f)

Чи f => fеквівалентно () => {}порожній анонімній функції?


3
Він повертає об'єкт в прямому сенсі f, відповідно до MDN
Eli Sadoff

4
не порожній анонім, це ідентичність.
Давін Тріон

17
FWIW, ви часто можете вставляти подібні конструкції в babel, щоб побачити, що таке еквіваленти в старих версіях ECMAscript.
Джеймс Торп


Ця відповідь на stackoverflow.com/questions/24900875/… не відповідає безпосередньо на це питання. Я знав, що f => f - анонімна функція, я просто не розумів, що саме робить. Я думаю, що це питання є конкретним випадком, і інформація, яку надає Фелікс Кінг про функції ідентичності, є унікальною для цього питання.
Щось

Відповіді:


114

f => f подібний * до function(f){ return f; }

Так близько, але не зовсім те, що ви очікували.

* - як було зазначено в коментарях, є тонкі розбіжності, але заради вашого питання я не думаю, що вони є особливо актуальними. Вони дуже актуальні в інших ситуаціях.


2
Я можу придумати як мінімум дві відмінності між f => fі function(f) { return f; }:)
Бенджамін Грюнбаум

6
@BenjaminGruenbaum крутий, іди вперед - навіть онови цю відповідь, якщо вважаєш її доречною.
Jamiec

4
Я не думаю, що це дуже актуально, просто педант: new (f => f)кидає, він має інше, toStringі я чомусь не можу дуже похизуватися (f => f).argumentsв Chrome, але не FF чи Edge.
Бенджамін Груенбаум

5
@BenjaminGruenbaum поводження thisтакож відрізняється. (хоча різниця може бути не помітна, якщо thisвона не з’явиться в тілі функції ... Я не впевнений)
Грегорі Нісбет

184

f => fє функцією ідентичності . Він просто повертає аргумент, який був переданий.

Ця функція часто використовується як значення за замовчуванням для процесів перетворення, оскільки вона не виконує жодної трансформації.

Чи f => fеквівалентно () => {}порожній анонімній функції?

Ні. Порожня функція нічого не повертає. Функція ідентичності повертає переданий аргумент.


43
+ Для надання імені, пояснення та випадку використання та відповіді на фактичне запитання.
Дякую


9

Інші вже згадували про те, що f => fробить, тому я не збираюся заглиблюватися в це. Я просто поясню решту функції, тому що між f => fі і є трохи різниця__DEV__ ? devTools() : f => f

__DEV__Потрійний оператор перевіряє, чи є правдоподібним значенням, і якщо так, то він повертає функцію devTools(). в іншому випадку він повертає функцію ідентичності, f => fяка нічого не робить. По-іншому: цей код включає деякі функції режиму розробки. Без решти коду важко сказати, що додає цей режим, але, мабуть, це дозволить отримати додаткову інформацію про реєстрацію та менше затуманення.


__DEV__ ? devTools() : f => fнічого не призначає f. Ви щось не залишили з прикладу коду?
Фелікс Клінг

2
Він не поверне функцію, поверне результат функції
Стефан Біджзіттер

1
Ваш аватар дратує мене і турбує мій день. Я відчуваю, що 90-ті і мій модем втратили зв’язок. Все-таки +1 у будь-якому випадку, для гарної відповіді.
Конрад Вільтерстен

@KonradViltersten Ви не перший, хто прокоментував мій аватар. Ти перший, кому це не подобається. Більшість людей оцінили ностальгічний фактор і малий підрив очікувань, які він викликає.
Nzall

1
Я сподіваюся, що ти отримав іронію, товариш. Це було зрозуміло, як жарт, звичайно. Очевидно, мені це подобається, і я вважаю його освіжаючим оригінальним.
Конрад Вільтерстен

9

Будь-коли із подібною дилемою ви можете скористатись Вабелом, щоб отримати відповідь.

Він повернувся так:

"use strict";

(function (f) {
  return f;
});

BTW, => ви використовували функцію ES6, яку називають виразом стрілки . Інше вираження інтересу

() => {};  // es6

перетвориться на:

(function () {});

Оскільки вирази функції стрілок завжди анонімні, це має сенс, якщо ви додасте ім'я до функції:

let empty = () => {}; // es6

перетвориться на

var empty = function empty() {}; 
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.