Что именно делает анонимная функция JavaScript f => f?

101

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

Я нашел этот код, который работает, но я не совсем понимаю, что происходит.

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

Является ли f => fэквивалентно () => {}пустой анонимной функции?

Что-то на
источник
3
Он возвращает объект литерал f, по MDN
Эли Sadoff
4
не пустой аноним, это личность.
Дэвин Трайон
17
FWIW, вы часто можете вставлять подобные конструкции в babel, чтобы увидеть, каковы эквиваленты в более старых версиях ECMAscript.
Джеймс Торп,
Этот ответ на stackoverflow.com/questions/24900875/… напрямую не отвечает на этот вопрос. Я знал, что f => f - анонимная функция, я просто не понимал, что именно она делает. Я думаю, что это частный случай, и информация, предоставленная Феликсом Кингом о функциях идентификации, уникальна для этого вопроса.
Something

Ответы:

114

f => f похоже на function(f){ return f; }

Так близко, но не совсем то, что вы ожидали.

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

Jamiec
источник
2
Я могу придумать как минимум два различия между f => fи function(f) { return f; }:)
Бенджамин Грюнбаум
6
@BenjaminGruenbaum круто, продолжайте - даже обновите этот ответ, если считаете его актуальным.
Jamiec
4
Я не думаю, что это очень актуально, просто педант: new (f => f)throws, у него другой toStringи по какой-то причине я не могу грокнуть (f => f).argumentsв Chrome, но не FF или Edge.
Benjamin Gruenbaum
5
@BenjaminGruenbaum thisтакже отличается от других. (хотя разница может быть незаметной, если thisне отображается в теле функции ... я не уверен)
Грегори Нисбет
184

f => f- функция тождества . Он просто возвращает переданный аргумент.

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

Является ли f => fэквивалентно () => {}пустой анонимной функции?

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

Феликс Клинг
источник
43
A + для предоставления имени, объяснения и варианта использования, а также ответа на фактический вопрос.
Спасибо
19

Если вы хотите знать, что f => fозначает, левая сторона - это параметр, а правая - возвращаемое значение. Так, например, f => f*2эквивалентно:

function(f) { 
  return f * 2; 
}

Код, который вы описываете, возвращает все, что ему передано в качестве входных данных.

https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Functions/Arrow_functions

Яти
источник
9

Другие уже упоминали, что f => fэто такое , поэтому я не буду углубляться в это. Я просто собираюсь объяснить остальную часть функции, потому что есть небольшая разница между f => fи__DEV__ ? devTools() : f => f

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

Нзалл
источник
__DEV__ ? devTools() : f => fничего не присваивает f. Вы что-то упустили из примера кода?
Феликс Клинг
2
Он не вернет функцию, он вернет результат функции
Стефан Биджзиттер
1
Ваш аватар меня раздражает и мешает мне провести день. Мне кажется, что 90-е и мой модем потерял связь. Тем не менее, +1 в любом случае за хороший ответ.
Конрад Вильтерстен,
@KonradViltersten Вы не первый, кто комментирует мою аватарку. Но ты первый, кому это не нравится. Большинство людей ценило ностальгический фактор и то небольшое опровержение ожиданий, которое он вызывает.
Нзалл
1
Надеюсь, ты понял иронию, дружище. Конечно, это было шуткой. Очевидно, мне это нравится, и я нахожу его освежающе оригинальным.
Конрад Вильтерстен,
9

В любое время, столкнувшись с подобной дилеммой, вы можете использовать Babel, чтобы получить ответ.

Он вернулся так:

"use strict";

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

Кстати, => вы использовали функцию ES6, называемую стрелочным выражением . Другое проявление интереса

() => {};  // es6

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

(function () {});

Поскольку выражения стрелочных функций всегда анонимны, имеет смысл добавить имя к функции:

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

преобразовал бы в

var empty = function empty() {}; 
Прости
источник