Необходима помощь по замыканиям.

229
10 января 2018, 20:15

Прохожу учебник по JS на известном сайте, и вроде я понял замыкания, осознал. Но... Вот решение к заданию:

  1. Создайте функцию filter(arr, func), которая получает массив arr и возвращает новый, в который входят только те элементы arr, для которых func возвращает true.
  2. Создайте набор «готовых фильтров»: inBetween(a,b) – «между a,b», inArray([...]) – "в массиве [...]". Использование должно быть таким:

Я хоть убейте второй день не могу понять откуда inBetween берет a и b, это функция вроде создана в другом lexical environment.

В общем объясните, чтобы до меня дошло. Почему это работает?

function filter(arr, func) {
  var result = [];
  for (var i = 0; i < arr.length; i++) {
    var val = arr[i];
    if (func(val)) {
      result.push(val);
    }
  }
  return result;
}
function inBetween(a, b) {
    return function(x) {
      return x >= a && x <= b;
    };
  }
var arr = [1, 2, 3, 4, 5, 6, 7];
alert( filter(arr, inBetween(3, 6)) ); // 3,4,5,6
Answer 1

Так как функция-замыкание inBetween() возвращает новую функцию, то для наглядности подставим код этой самой новой функции вместо её вызова здесь:

                             a  b
alert( filter(arr, inBetween(3, 6)) );

Получим такой код, где вместо a и b соответственно аргументы 3 и 6:

alert( filter(arr, function(x) {
    return x >= 3 && x <= 6;
  })
);

Ну а дальше просто происходит вызов этой функции для каждого элемента массива, где выполняется проверка на принадлежность диапазону [3,6]:

if (func(val)) {
  result.push(val);
}
READ ALSO
Форма отображается с задержкой

Форма отображается с задержкой

Код отвечающий за отображение формы

237
Notification API в Chrome

Notification API в Chrome

ЗдравствуйтеСоздал на сайте кнопку, по клику на которую должны появляться браузерные уведомления

226
Проверка наличия формы на странице

Проверка наличия формы на странице

Хочу написать функцию проверки наличия формы на страницеФорма любая

202