Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   вопрос о замыкании (https://javascript.ru/forum/misc/75962-vopros-o-zamykanii.html)

TheOwl 20.11.2018 16:56

вопрос о замыкании
 
Доброго времени суток!!! кто сможет проясните пожалуйста вопрос.

Изучая учебник данного сайта, возникли, как мне кажется вполне логичные вопросы.

1. Присваивая или читая глобальную переменную, мы, фактически, работаем со свойствами window.

Например:

var a = 5; // объявление var создаёт свойство window.a
alert( window.a ); // 5
Создать переменную можно и явным присваиванием в window:

window.a = 5;
alert( a ); // 5


далее по учебнику изучая замыкание, приводится пример со счетчиком.

function makeCounter() {
var currentCount = 1;

return function() { // (**)
return currentCount++;
};
}

var counter = makeCounter(); // (*)


Это все понятно, но если alert(counter.currentCout) //undefined
Вот и вопрос, ранее говорилось что переменные становятся свойством, но просмотреть это свойство в данном случае я не могу... И возможно ли как то работать с этой переменной без функции, по ходу выполнения кода?!

Nexus 20.11.2018 17:08

Цитата:

Сообщение от TheOwl
ранее говорилось что переменные становятся свойством, но просмотреть это свойство в данном случае я не могу

В учебнике говорилось о глобальной переменной, у вас же переменная находится в функции, у которой своя область видимости.
Взаимодействовать с переменной "currentCount" извне нельзя.


Теоретик с меня фиговый, а учитель еще худший, так что надеюсь поймете о чем речь.

j0hnik 20.11.2018 17:14

чтобы обращаться как к свойству его надо присвоить явно.
counter.currentCout = 'знач'
напрямую получить currentCount нельзя из за области видимости.

j0hnik 20.11.2018 17:24

function makeCounter() {
			currentCount = 1;

			return function() {
				return currentCount++;
			};
		}

		var counter = makeCounter();
		console.log(counter());
		console.log(counter());
		console.log(currentCount);


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

Malleys 20.11.2018 17:34

А объявление let не создаёт
<script>
let a = 5;
alert(window.a);
</script>

TheOwl 20.11.2018 18:19

Так более понятней стало. Нужно это уточнение о приватности внести в учебник. Спасибо!

MallSerg 20.11.2018 23:54

В js переменные это всегда свойства какого либо объекта любое объявление var, let, const расширяет «[[scope]]» (специальный объект) текущей функции (области видимости). При создании замыкания (новой функции в текущей области видимости) создается новый [[scope]] в котором есть ссылка на родительский [[scope]] и т.д. пока не дойдет до глобального объекта.
т.е. все переменные находятся в одной большой древовидной структуре


Часовой пояс GMT +3, время: 03:50.