Задать вопрос
@alexnotonfire

Почему во внешней функции аргументы недоступны, а во внутренней — доступны?

Есть массив объектов и есть сортировка массива по полю num. Все работает, но я не могу въехать почему во внешней функции, при ее вызове, переданные аргументы - недоступны, а во внутренней - доступны? Вроде бы как функция должна содержать информацию о внешних переменных. Просветите, пожалуйста, кто понимает?

let numbers = [{ num: 3, name: 'Josh'}, { num: 1, name: 'Alice' }, { num: 2, name: 'Bob' }];

function byField(field) {
  // Почему здесь переменные a и b - недоступны
  return function(a, b) {
    // А здесь уже доступны?
    return a[field] > b[field] ? 1 : -1;
  }
}

numbers.sort(byField('num'));
  • Вопрос задан
  • 246 просмотров
Подписаться 1 Простой 5 комментариев
Решения вопроса 1
ivanshumakov
@ivanshumakov
Делаю свои первые шаги в мире IT
Переменные a и b объявлены в самой внутренней функции и они являются свойствами лексического окружения (Lexical Environment) именно этой функции и видны только внутри нее (снаружи не видны).
Если бы переменные были бы заданы внутри функции с помощью var то это были бы свойства глобального объекта (в браузере window) и были бы доступны всюду, но в вашем случае это не так.
Если бы вы сказали для чего они вам там нужны, помочь вам стало бы возможным.
PS Вот так вот будет видно везде:
// и даже здесь
function byField(field) {
  // теперь c и d доступны здесь (раз уж это вам так надо)
  return function(a, b) { 
    var c = a, d = b;
    return a[field] > b[field] ? 1 : -1;
  }
}

Только правильнее было бы поступить так:
var compareByField = byField('num');
numbers.sort(compareByField(a, b));
Ответ написан
Пригласить эксперта
Ответы на вопрос 2
mazhekin
@mazhekin
Frontend, Backend Web Developer
numbers.sort(function(a, b) {return a.num > b.num ? 1 : -1 })
Может так понятней
Ответ написан
Комментировать
Negwereth
@Negwereth
lvivcss.com.ua
Потому что аргументы функции доступны только во время её выполнения. Именно на этом и строятся области видимости. И именно поэтому родительская функция никогда не видит переменные из дочерней.
Ответ написан
Комментировать
Ваш ответ на вопрос

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

Похожие вопросы