Как обратные вызовы получают доступ к методам

Мне интересно, как мы можем использовать рез.рендер внутри обратного вызова

function getUsers(cb){
  fs.readFile('data.json', 'utf8', (err, data) => {
    if (err) return cb(err);
    const users = JSON.parse(data);
    return cb(null, users);
  });
}

app.get('/', (req,res) => {
  getUsers((err,users) =>{
    if(err){
      res.render('error', {error:err})
    } else{
      res.render('index', {title: "users", users: users.users});
    }
  })
}); 

Поскольку, когда мы передаем обратный вызов, Callstack загружается функцией getUsers (cb), и мы больше не находимся внутри маршрута, то как обратный вызов использует метод res.render? И как мне узнать, какие значения доступны для обратных вызовов?

Формы c голосовым вводом в React с помощью Speechly
Формы c голосовым вводом в React с помощью Speechly
Пытались ли вы когда-нибудь заполнить веб-форму в области электронной коммерции, которая требует много кликов и выбора? Вас попросят заполнить дату,...
В чем разница между Promise и Observable?
В чем разница между Promise и Observable?
Разберитесь в этом вопросе, и вы значительно повысите уровень своей компетенции.
Сравнение структур данных: Массивы и объекты в Javascript
Сравнение структур данных: Массивы и объекты в Javascript
Итак, вы изучили основы JavaScript и хотите перейти к изучению структур данных. Мотивация для изучения/понимания Структур данных может быть разной,...
Создание собственной системы электронной коммерции на базе Keystone.js - настройка среды и базовые модели
Создание собственной системы электронной коммерции на базе Keystone.js - настройка среды и базовые модели
Прошлая статья была первой из цикла статей о создании системы электронной коммерции с использованием Keystone.js, и она была посвящена главным образом...
Приложение для отслеживания бюджета на React js для начинающих
Приложение для отслеживания бюджета на React js для начинающих
Обучение на практике - это проверенная тема для достижения успеха в любой области. Если вы знаете контекст фразы "Практика делает человека...
Стоит ли использовать React в 2022 году?
Стоит ли использовать React в 2022 году?
В 2022 году мы все слышим о трендах фронтенда (React, Vue), но мы не знаем, почему мы должны использовать эти фреймворки, когда их использовать, а...
1
0
20
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Встроенные функции/обратные вызовы, которые вы используете здесь, могут видеть область родительской функции и все ее переменные и аргументы. Это называется «лексической областью».

Если обратный вызов не был встроенным, то он не мог видеть эти переменные/аргументы, потому что функция была бы объявлена ​​в другой области.

Вот почему встроенный обратный вызов для readFile(), который вы объявили, может получить доступ к cb(...), и точно так же встроенный обратный вызов, который вы передаете getUsers(), может получить доступ к req и res. Это все аргументы в родительской области.

Обратите внимание, что доступ к этим родительским переменным/аргументам осуществляется не из стека вызовов. Это из лексический объем.


Этот доступ к res.render() работает только потому, что функция объявлена ​​внутри лексической области видимости, где res доступна. Если вместо этого ваш маршрут был объявлен следующим образом:

function getUsersCallback(err, users) {
    if(err){
      res.render('error', {error:err})
    } else{
      res.render('index', {title: "users", users: users.users});
    }
}

app.get('/', (req,res) => {
  getUsers(getUsersCallback);
}); 

Тогда это не сработает, потому что функция обратного вызова не объявлена ​​в лексической области видимости, которая имеет доступ к req и res.


Имейте в виду, что аргументы функций и локальные переменные в Javascript хранятся в объектах области видимости, а не в стеке вызовов, как в таких языках, как C/C++. Это происходит по целому ряду причин, не последней из которых является то, что время жизни области действия функции может превышать время, когда функция возвращается (из-за закрытия), и поэтому области могут быть связаны цепочкой, чтобы интерпретатор мог искать вещи в родительской области ( чтобы реализовать «лексическую область видимости», которую реализует язык).

Спасибо @jfriend00, сэр, еще раз за то, что помогли мне и так быстро. Я очень ценю это.

Karan Badhwar 09.04.2022 06:58

Другие вопросы по теме