Прежде чем понять код, которым вы поделились, давайте сначала изучим синтаксис функции фильтра.
var newArray = arr.filter(callback(currentValue[, index[, array]])[, thisArg])
callback Функция является предикатом, чтобы проверить каждый элемент массива. Верните true, чтобы сохранить элемент, иначе false, принимая три аргумента: element
, index
и сам array
. thisArg
необязательно, хотя.
Теперь давайте попробуем разобраться в коде.
let hasPower = power =>
obj =>
obj.power === power
Функция hasPower
может быть обновлена как:
let hasPower = function (power) {
return function (obj) {
return obj.power === power;
}
}
Просто имейте в виду, что всякий раз, когда будет выполняться hasPower
, он просто возвращает функцию (которая будет выполнена позже) и будет иметь доступ к переменной power
. (Подробнее: Закрытие )
а теперь огненные драконы
let fireDragons = dragons.filter(hasPower("Fire"));
Вы передаете функцию в качестве параметра функции фильтра ( вызывает также ).
При выполнении этой строки кода сначала будет выполняться функция hasPower("Fire")
, и все, что будет возвращено из этой функции, будет передано фильтру как функция callback
.
По сути, это будет что-то вроде:
let fireDragons = dragons.filter(function (obj) {
// Having access to the `hasPower` variable which is "Fire" in your case.
return obj.power === power;
});
или точно так:
![enter image description here](https://i.stack.imgur.com/TcLUi.png)
Всегда старайтесь отлаживать в инструментах разработчика, чтобы понять, как работает код, и не стесняйтесь заменять функции-стрелки обычными, чтобы сделать его более читаемым / понятным.