вопрос о замыкании
Доброго времени суток!!! кто сможет проясните пожалуйста вопрос.
Изучая учебник данного сайта, возникли, как мне кажется вполне логичные вопросы. 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 Вот и вопрос, ранее говорилось что переменные становятся свойством, но просмотреть это свойство в данном случае я не могу... И возможно ли как то работать с этой переменной без функции, по ходу выполнения кода?! |
Цитата:
Взаимодействовать с переменной "currentCount" извне нельзя. Теоретик с меня фиговый, а учитель еще худший, так что надеюсь поймете о чем речь. |
чтобы обращаться как к свойству его надо присвоить явно.
counter.currentCout = 'знач' напрямую получить currentCount нельзя из за области видимости. |
function makeCounter() { currentCount = 1; return function() { return currentCount++; }; } var counter = makeCounter(); console.log(counter()); console.log(counter()); console.log(currentCount); если вам глобально как к переменной надо будет обращаться, сделайте так, уберите var, но замыкание для того и сделано, чтобы переменная была приватной. |
А объявление let не создаёт
<script> let a = 5; alert(window.a); </script> |
Так более понятней стало. Нужно это уточнение о приватности внести в учебник. Спасибо!
|
В js переменные это всегда свойства какого либо объекта любое объявление var, let, const расширяет «[[scope]]» (специальный объект) текущей функции (области видимости). При создании замыкания (новой функции в текущей области видимости) создается новый [[scope]] в котором есть ссылка на родительский [[scope]] и т.д. пока не дойдет до глобального объекта.
т.е. все переменные находятся в одной большой древовидной структуре |
Часовой пояс GMT +3, время: 03:50. |