Как понять алгоритм работы вызова этой функции?

Здравствуйте!
Я новичок, читаю книжку по Javascript, и никак не могу понять один момент:

1. У нас есть данные в JSON формате в переменной ANCESTRY_FILE: eloquentjavascript.net/code/ancestry.js

2 .Мы конвертируем его в объект Javascript:
var ancestry = JSON.parse(ANCESTRY_FILE);

3. Нам нужно найти людей, кто родился с 1900 по 1925 года, и предлагается такой вариант реализации:
function filter(array, test) {
  var passed = [];
  for (var i = 0; i < array.length; i++) {
    if (test(array[i]))
      passed.push(array[i]);
  }
  return passed;
}

//Вызываем функцию
console.log(filter(ancestry, function(person) {
  return person.born > 1900 && person.born < 1925;
}));

Мы вызываем функцию "filter" в качестве первого аргумента используем наш объект а в качестве второго аргумента функцию. Тут я понимаю как пошагово будет вести себя парсер и почему нам вернут 3 объекта.

5. Но дальше нам предлагают вызвать функцию по другому, как метод объекта ancestry, и мы получаем точно такой же результат, нам вернут 3 тех же объекта.
//Вызываем функцию
console.log(ancestry.filter(function(person) {
  return person.born > 1900 && person.born < 1925;
}));

Я никак не могу понять, как будет вести себя парсер JS, и почему этот код работает. Как я понимаю, судя по приоритету операторов сначала будет исполнен этот код:
filter(function(person) {
  return person.born > 1900 && person.born < 1925;
})

А дальше вообще не могу понять что происходит. Мы задаем функции "filter" только один аргумент в виде функции которая возвращает "person.born > 1900 && person.born < 1925". Как мы даем понять функции filter из какого объекта брать данные... В книжке только пишут "Like forEach, filter is also a standard method on arrays", то есть "Как и forEach, filter является стандартным методом массивов". Это все понятно вроде, но это не объясняет почему этот способ работает...

Буду благодарен, если кто-то сможет написать как подробно будет выполнятся код начиная с моего пункта 5, где мы вызываем функцию filter как метод объекта ancestry. Вроде и теоретические знания есть но никак не могу понять уже второй день... Толи я так туплю толи что, не знаю ( Буду благодарен любой помощи.

Заранее спасибо
  • Вопрос задан
  • 356 просмотров
Решения вопроса 1
Denormalization
@Denormalization
Функция filter вызывается на объекте ancestry.
Это стандартная функция, прочитать тут.
Т.е вызывается не ваша реализация, а стандартная реализация из прототипа.
Она принимает только 1 параметр - callback, который она вызывает.

Ваша изначальная реализация функции filter - лишь пример того, как она может выглядеть, и чтобы понимать как она работает.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы
28 мар. 2024, в 21:25
2000 руб./за проект
28 мар. 2024, в 21:17
5000 руб./за проект
28 мар. 2024, в 20:46
150000 руб./за проект