Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 20.11.2018, 16:56
Интересующийся
Отправить личное сообщение для TheOwl Посмотреть профиль Найти все сообщения от TheOwl
 
Регистрация: 20.11.2018
Сообщений: 15

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

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

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
Вот и вопрос, ранее говорилось что переменные становятся свойством, но просмотреть это свойство в данном случае я не могу... И возможно ли как то работать с этой переменной без функции, по ходу выполнения кода?!
Ответить с цитированием
  #2 (permalink)  
Старый 20.11.2018, 17:08
Профессор
Отправить личное сообщение для Nexus Посмотреть профиль Найти все сообщения от Nexus
 
Регистрация: 04.12.2012
Сообщений: 3,790

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


Теоретик с меня фиговый, а учитель еще худший, так что надеюсь поймете о чем речь.
Ответить с цитированием
  #3 (permalink)  
Старый 20.11.2018, 17:14
Аватар для j0hnik
Профессор
Отправить личное сообщение для j0hnik Посмотреть профиль Найти все сообщения от j0hnik
 
Регистрация: 01.12.2016
Сообщений: 3,650

чтобы обращаться как к свойству его надо присвоить явно.
counter.currentCout = 'знач'
напрямую получить currentCount нельзя из за области видимости.
Ответить с цитированием
  #4 (permalink)  
Старый 20.11.2018, 17:24
Аватар для j0hnik
Профессор
Отправить личное сообщение для j0hnik Посмотреть профиль Найти все сообщения от j0hnik
 
Регистрация: 01.12.2016
Сообщений: 3,650

function makeCounter() {
			currentCount = 1;

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

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


если вам глобально как к переменной надо будет обращаться, сделайте так, уберите var, но замыкание для того и сделано, чтобы переменная была приватной.
Ответить с цитированием
  #5 (permalink)  
Старый 20.11.2018, 17:34
Аватар для Malleys
Профессор
Отправить личное сообщение для Malleys Посмотреть профиль Найти все сообщения от Malleys
 
Регистрация: 20.12.2009
Сообщений: 1,714

А объявление let не создаёт
<script>
let a = 5;
alert(window.a);
</script>
Ответить с цитированием
  #6 (permalink)  
Старый 20.11.2018, 18:19
Интересующийся
Отправить личное сообщение для TheOwl Посмотреть профиль Найти все сообщения от TheOwl
 
Регистрация: 20.11.2018
Сообщений: 15

Так более понятней стало. Нужно это уточнение о приватности внести в учебник. Спасибо!
Ответить с цитированием
  #7 (permalink)  
Старый 20.11.2018, 23:54
Аватар для MallSerg
Профессор
Отправить личное сообщение для MallSerg Посмотреть профиль Найти все сообщения от MallSerg
 
Регистрация: 07.03.2011
Сообщений: 1,134

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



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
вопрос про возможности JS для рисования и анимации macdack Библиотеки/Тулкиты/Фреймворки 3 15.07.2011 00:13
Я как ответить на вопрос - есть ли жизнь на других планетах? TicTac Оффтопик 5 28.04.2011 04:29
Вопрос авторизации. 0931454574 Серверные языки и технологии 8 12.04.2011 11:09
Вопрос на миллион. Ajax и идентификация по адресной строке. 0931454574 AJAX и COMET 5 31.03.2011 11:54
Вопрос по замыканиям Goodfella Общие вопросы Javascript 20 09.03.2011 01:21