Вопрос про область видимости в JS?

Есть код:
function someFunction(){
  var a=0;
  foo(function(bar){
    if(bar){
      a=1;
    }
  });
  alert(a);
}


Сейчас функция выдает 0, т.к. переменная изменяется в другой функции, а надо чтобы выдавала 1. Как это можно сделать без глобальных переменных?
  • Вопрос задан
  • 2551 просмотр
Решения вопроса 1
kuzemchik
@kuzemchik
Все зависит от синхронности/асинхронности foo. Если она синхронна, то есть как описал megahertz будет alert(1). Если она асинхронна, то будет alert(0), так как alert выполнится раньше чем анонимная функция foo.
Ответ написан
Пригласить эксперта
Ответы на вопрос 2
megahertz
@megahertz
full stack разработчик
Если предположить что
function foo(f){
    f(true)
};

то все работает как и ожидается
Ответ написан
sompylasar
@sompylasar
Frontend Software Engineer
Пожалуйста, не путайте объявление (создание) функции и вызов функции. В вашем коде вызывается функция foo, ей передается в качестве параметра тут же созданная анонимная функция, которая может вообще не быть вызвана или хоть как-то использована внутри foo. Поэтому, как заметили ранее blo и kuzemchik, результат зависит от кода функции foo и от ее синхронности.

В неупрощенном примере, по-видимому, вы используете Node.js, поэтому лучше воспользоваться полностью асинхронной моделью, нежели заменять функцию на синхронную, то есть в функцию getView принимать функцию, которая будет вызвана по завершении асинхронной операции и будет принимать результат завершения.

И еще, на мой взгляд, лучше явно отличать случаи ошибки и правильного исполнения, то есть в output при неудаче класть null или undefined, а не строку с «магическим» содержанием 'not exists'.

function getView(name, params, callback) {
//< Дополнительный параметр должен быть function callback(error, output) 
    var filepath = ...;
    path.exists(filepath, function (exists) {
        var view = ...,
            error = null, //< Ошибки изначально нет.
            output = null; //< Результата изначально нет.
        
        if (exists) {
            output = ...; //< Записываем результат выполнения. Ошибки нет.
        }
        else {
            error = new Error('View '+ name + ' file ' + filepath + ' not found'); //< Результата нет, но есть ошибка.
            console.log(error); //< Её и логируем.
        }
        callback(error, output); //< Вызываем обработчик завершения, в который передаем ошибку (даже если ее нет, всегда первым параметром - так принято в Node.js) и следом результат.
    });
    //< Ничего не возвращаем. Результат попадет в callback, когда он станет доступным.
}
Ответ написан
Комментировать
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы