Замыкания

Есть функция, принимающая параметром другую функцию

   function filter(arr, actionFunc){
    	var newArr = [];

        for(var i = 0; i < arr.length; i += 1){
	    if( actionFunc(arr[i]) ){
		    newArr.push(arr[i]);
	    }
        }
        return newArr;
    }

Создаем ту самую “вторую” функцию

    function inBetween(min, max){
        return function  inBetweenInner(val){
	    if( val >= min && val <= max){
		   return true;
	    }
	    return false;
        };
    }

передаем ее в первую

    filter(arrTo5, inBetween(3, 6));

Собственно вопрос - когда мы передает аргументом функцию он вычисляется в результат ее работы где возвращается внутренняя функция

    return function  `inBetweenInner(val){  ...   }`

а параметры 3 и 6 из `

filter(arrTo5, inBetween(3, 6));  

уже передались во внутреннюю функцию `как

       function  inBetweenInner(val){
	    if( val >= 3 && val <= 6 ){
		   return true;
	    }
	    return false;
       }

;
и если подумать как в вызов

    filter(arrTo5, inBetween(3, 6));   

вторым параметром возвращается результат выполнения функции

    inBetween()

тогда можно представить такое:

    function filter(arr, actionFunc){
        var newArr = [];

        for(var i = 0; i < arr.length; i += 1){
	     if( 
		function  inBetweenInner( arr[i] ){
			if( val >= min && val <= max){
				return true;
			}
			return false;
		}
	      ){
		newArr.push(arr[i]);
	     }
        }
        return newArr;
   }

Хотя этот код выдаст ошибку, он наглядно объясняет работу техники замыкания в javascript
и каждый раз в цикле текущим параметров уже есть элемент массива

    function  inBetweenInner( arr[i] ){  ,,,  }

Так я понимаю замыкания.
Хочу услышать мнение опытных людей и их советы и исправления если какие-то мои объяснения не соответствуют действительности.
Спасибо.

Чуть уточню как это происходит:

Замыкание - это характеристика функций. Характеристика звучит так: при вызове функция может использовать переменные из тех обсластей видимости, где функция была объявлена. Вне зависимости от того в каких областях видимости функция вызывается.

Область видимости в js или глобальная, или создается динамически при вызове функции.

// Глобальна область видимости
var a = 0;
function inc() {
	// область видимости функции. Создается каждый раз при вызове функции
	// b объявляется в области видимости функции inc
	var b = 1;
	// изменение переменной из области видимости уровнем выше
	a += b;
	console.log(a);
}
// При каждом вызове значение переменной `a` на глобальном уровне изменяется
inc(); // 1
inc(); // 2
inc(); // 3

Становится интереснее, когда ссылка на функцию, объявленную в одной области видимости, попадает более изощренным способом в другую.

function inBetween(min, max) {
		// При каждом вызове создается область видимости функции inBetween
		// Создается функция, которая видит переменные родительсткой области видимости, в которых есть переменные min и max
    return function inBetweenInner(val) {
        if (val >= min && val <= max) {
            return true;
        }
        return false;
    };
}

// В переменную comparator записана функция, которая при вызове будет "видеть" переменные из
// той области видимости, где функция была создана.
var comparator = inBetween(10, 20);
1 лайк

Т. е. в коде

    function inBetween(min, max) {
       return function inBetweenInner(val) {
          if (val >= min && val <= max) {
              return true;
          }
          return false;
        };
    }

функция

    inBetweenInner

видит переменные в родительской функции

    inBetween

верно?

Еще у меня были трудности с пониманием вызовов подобных конструкций вложенных замкнутых функций когда сперва передаются одни аргументы а после другие, к примеру:

        function compare(x) {
		return function (y){
			return ( y > x || y < x) ? y > x : null;
		};
	}

после чего следует инициализация переменной которой присваивается вызов функции с параметром 5

    var com = compare(5); //*

Т. е. сейчас в

    com

вернулось значение внутренней функции в которой уже установлен параметр

    x

равный пяти
точно также как в первом вопросе, переменную можно представить

     var com = function (y){
			return ( y > 5 || y < 5) ? y > 5 : null;
		};

Важный момент - 5 уже стоит, и при последующих вызовах, к примеру

    com(4); //**

четверка это параметр

    y

Тогда в первый раз через скобки мы передавали “х”, а все последующие разы будем передавать “у”.
Так ли работают передачи аргументов двух разных примеров в случае * и случае **,
Спасибо.

Верно.