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

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

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

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

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

Ответ 1

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

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

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

Ответ 2

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

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

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

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

Ответ 3

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

function(f) { 
  return f * 2; 
}

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

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

Ответ 4

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

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

Ответ 5

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

Он возвращался так:

"use strict";

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

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

() => {};  // es6

преобразуется в:

(function () {});

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

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

преобразуется в

var empty = function empty() {};