Страницы

Поиск по вопросам

четверг, 12 декабря 2019 г.

Зачем нужен return

#javascript #функции


Может кто-нибудь знает, почему следующий код js выводит "1"? Как он работает? Так
как я не понимаю, для чего там написан return;, и функция переопределяет а или нет

var a = 1;
function b() {
  a = 10;
  return;
  function a() {}
}
b();
console.log(a);

    


Ответы

Ответ 1



Потому что объявление функции всплывает. var a = 1; function b() { function a() {} a = 10; return; } b(); console.log(a); После этого ты берёшь имя a, которое обозначает функцию, и используешь в качестве переменной, в которую помещаешь 10. Фактически, ссылка на функцию теряется, но ты её нигде и не используешь. Выходит нечто такое: var a = 1; function b() { var a = function a() {} a = 10; return; } b(); console.log(a); Ну и естественно, функция меняла внутреннюю переменную, а внешняя как была равна 1, так и осталась. А return тут и не при чём вовсе.

Ответ 2



В данном примере var a = 1; function b() { a = 10; return; function a() {} } b(); console.log(a); предложение return используется преднамеренно, чтобы запутать того, кто будет пытаться понять или отвечать на вопрос, как работает код. То есть предложение return помещено перед определением функции с именем a, дабы у смотрящего этот код создалось впечатление, что это определение функции будет просто проигнорировано и никак не повлияет на выполнение функции b и на коллизию имени a для глобальной переменной и переменной, используемой в объявлении функции. В таких языках программирования, как, например, C++, где есть область видимости переменной, начинающаяся с момента ее объявления, это было бы верно. Однако в JavaScript действуют другие правила видимости переменных. Когда функция становится активной, то сначала парсер просматривает все объявления переменных в данной функции и делает областью их видимости всю функцию. Это можно представить следующим образом function b() { function a() {} a = 10; return; } То есть объявление функции с именем a как будто бы помещается в самое начало функции b. Тем самым глобальная переменная a скрывается, а в функции происходит обращение к локальной переменной с тем же именем a. Сначала эта переменная объявляется как ссылка на функцию, а затем ей присваивается значение 10, так как JavaScript не типизированный язык, а переменные использует для хранения любых значений. Поэтому присвоение a = 10; никак не влияет на глобальную переменную a, которой было присвоено значение 1 var a = 1; Поэтому предложение console.log(a); выведет в консоль это значение глобальной переменной. Кстати сказать, после предложения a = 10; вы уже не можете обратиться к функции с именем a, даже если убрать предложение с return, так как ссылка на функцию тем самым утеряна. То есть вы не можете написать, например function b() { a = 10; function a() {} a(); }

Комментариев нет:

Отправить комментарий