Ваше предположение верно для внешней функции.Первая строка внутри него будет выглядеть так:
function sum(array, n) {
return array.reduce(function(a, an) {
return a + (an === n);
}, 0);
Прочтите о функциях со стрелками и о том, чем они отличаются от обычных объявлений функций.В основном (но не полностью) они являются просто синтаксическим сахаром по сравнению с обычными функциями.
Они отличаются наиболее заметно с точки зрения контекста, то есть того, на что указывает this
внутри тела функции.Функции стрелок всегда выполняются во внешнем преобладающем контексте, в котором была объявлена функция.Обычные функции, например, через bind()
, могут быть переназначены в другой контекст.
let foo = function() {
let bar = () => this;
return bar();
}.bind('a');
foo(); //'a', because foo()'s context is 'a'
Так как насчет этого сахара?Поначалу это может показаться странным, особенно если у вас есть несколько функций стрелок в одной строке.Одна ключевая вещь, которую нужно помнить, это то, что они являются просто неявным сокращением для вещей, которые вы должны были кодировать вручную.
let foo = a => a+1;
То же самое, что
function foo2(a) { return a + 1; }
(подъем будет отличаться, но это немного выходит за рамки этого ответа.)
Одна вещь, которую мы можем сказать из вышесказанного, состоит в том, что, где часть после =>
является одним оператором, оно интерпретируется как возвращаемое значение, без необходимости писать return
.
foo(1); //2
Это отлично подходит для простых функций, которые выполняют одну работу, выражаемую в одной строке кода.Если вам нужно больше подробных функций, вы заключаете код в {}
как обычно.
let foo3 = a => {
return a+1;
};
Это снова работает аналогично foo
и foo2
выше.
И так,наконец, ломая эту грозную строку:
let sum = (array, n) => array.reduce((a, an) => a + (an === n), 0);
Он говорит:
- назначить функцию локальной переменной области видимости
sum
- он принимает два аргумента,
array
и n
- он выполняет одну работу, выражаемую в виде одной строки кода, и, следовательно, нет необходимости связывать
{
и }
для тела функции.Эта задача состоит в том, чтобы вызвать reduce()
и вернуть (неявно) значение - Первый аргумент для
reduce
, обратного вызова, принимает два аргумента, a
и an
- ThisОбратный вызов, как и у
reduce
, также имеет только одну задачу, и эта задача состоит в том, чтобы вернуть значение a + (an === n)
Одно последнее слово о сахаре, которое вы можете иметьВыше было отмечено, что при использовании функций со стрелками, если принимается только один аргумент, вам не нужно заключать его в квадратные скобки.Однако несколько аргументов разделяются запятыми, как обычно.
let foo = single_arg => alert(1);
let foo2 = (arg1, arg2) => alert(2);
Надеюсь, это поможет.