Я использую стороннюю библиотеку, которая имеет функцию, которая принимает функции в качестве аргументов. Я выполняю некоторые условные проверки, чтобы решить, следует ли добавлять определенную функцию в качестве параметра, и в некоторых случаях я не хочу предоставлять функцию. Предоставление 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() {};