chil
@chil
Junior

Почему данный код сработает?

Добрый день! кто может объяснить почему выводится консоль в даном случае?
// 'use strict';
	
	(function(){
		a = 2;
		
		(function(){
			b = 3;
		})();
		
	})();
	
	var a;
	
	console.log(a); // 2 ?
	console.log(b); // 3 ?

Переменные не объявляются нигде плюс там своя область видимости
  • Вопрос задан
  • 100 просмотров
Решения вопроса 3
kshshe
@kshshe
Frontend developer
Потому что когда вы пишете a = 2, не объявляя ее, значение записывается в глобальную переменную a. Если внутри функций заменить a = 2 на let a = 2, поведение поменяется.
Ответ написан
dimovich85
@dimovich85 Куратор тега JavaScript
https://u-academy.net/
Да, ответ выше правильный, потому что без var или let. А вот после функций есть var a, то это объявление переменной поднимается вверх перед выполнением всего скрипта, но в а ничего не записывается, а запишет значение функция.
Ответ написан
Комментировать
@Cruper
web-падаван
В глобальном окружении объявляется переменная a (window.a)
Объявление поднимается на самый верх - всплытие переменных
var a;

Самовызывающаяся функция
(function(){
    a = 2;
    
    (function(){
      b = 3;
    })();
    
  })();


Интерпретатор ищет переменную а в лексическом окружении функции и не находит её
Далее он начинает искать её во внешнем объекте переменных. В данном случае - это window
Происходит присвоение window.a = 2
a = 2;

Тоже самое, что и с переменной а, только во внешнем объекте переменных тоже нет такой переменной и интерпретатор начинает искать её во внешнем объекте переменных первой функции, т.е. в глобальном окружении.
b = 3;

К слову, если бы не было присвоения переменных a=2 и b=3, то вывод этих переменных в консоль вывело undefined для a, а для b выбросило бы исключение, т.к. b не была объявлена.
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

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

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