|
5 / 5 / 0
Регистрация: 07.06.2012
Сообщений: 111
|
||||||
Понимание области видимости и смежных понятий14.01.2017, 14:52. Показов 766. Ответов 5
Метки нет (Все метки)
Имеем вот такой код:
В объяснении данного эффекта мне могут помочь такие понятия как hoisting, lexical environment. Я с ними знаком, но всё-равно не могу сообразить почему в данном примере глобальная переменная a НЕ переписывается функцией b();
0
|
||||||
| 14.01.2017, 14:52 | |
|
Ответы с готовыми решениями:
5
Имя области видимости Области видимости переменных + функции Вложенные $post и области видимости |
|
30 / 28 / 14
Регистрация: 06.01.2016
Сообщений: 161
|
||
| 14.01.2017, 17:12 | ||
0
|
||
|
5 / 5 / 0
Регистрация: 07.06.2012
Сообщений: 111
|
||
| 14.01.2017, 18:38 [ТС] | ||
Еще кое-какие мысли у меня возникли: Читал я на хабре статью про это поведение, потом нашел оригинал статьи на английском и вот что там написано: The most important special case to keep in mind is name resolution order. Remember that there are four ways for names to enter a given scope. The order I listed them above is the order they are resolved in. In general, if a name has already been defined, it is never overridden by another property of the same name. This means that a function declaration takes priority over a variable declaration. This does not mean that an assignment to that name will not work, just that the declaration portion will be ignored. Полного понимания еще не пришло, но основная гипотеза вот такая: В области видимости функции b(), на этапе инициализации осуществляется подъем(всплытие) функции a(), в этой области видимости у нас имеется пока что только функция а(); она имеет какое-то уникальное имя, наверное а и это имя уникально внутри этой области видимости. А что дальше происходит? Дальше, этому уникальному имени, присваивается значение 10. Но это значение присваивается именно уникальному имени, которое существует только в scope функции b(). Несмотря на то, что имя совпадает с именем глобальной переменной. И то, что мы на третьей строчке присваиваем переменной значение 10, мы на самом деле присваиваем это значение не глобальной переменной, а локальной. Локальной она стала потому что в этом scope была функция с таким же именем, которая, всплыла на этапе инициализации(вот в этом месте она уже локальная) и потом мы ее перезаписали. Т.е. эффект получился тот же самый, как если бы на третьей строчке использовался var. == Имя переменной это ссылка на область данных в памяти. Имя функции это ссылка на область данных в памяти. Имена должны быть разными. Одно и тоже имя ссылается на одни и те же данные. Но если мы создаем переменную или функцию с таким же именем в другой области видимости, то там она уже указывает на другие данные. Это мне понятно. Теперь мне стало понятно, что когда на шестой строчке кода я написал function a() {}; я создал ссылку на данные в области видимости b() и имя это ссылки а и это имя указывает на функцию только в пределах области видимости. Потом происходит hoisting и ссылка загружается в память и имя той ссылки а, и указывает та ссылка на функцию function() {};. Потом я переписываю эту локальную ссылку и теперь она указывает на 10. Теперь я имею локальную переменную с именем a, которая никакого отношения к глобальной переменной не имеет. Ну вроде понятно. Я полагаю, что этот злополучный код, который иллюстрирует работу механизма hoisting хитрым образом создал новую локальную переменную(ссылку) а и сначала ей присвоил значение функции, а потом числовое значение. Вот оказывается, как всё хитро устроено. Ведь невооруженным глазом смотришь и кажется, что если на третьей строчке переменная а написана без var, то значит мы обращаемся к переменной из внешнего окружения, ан нет.
0
|
||
|
30 / 28 / 14
Регистрация: 06.01.2016
Сообщений: 161
|
|
| 14.01.2017, 19:07 | |
|
Переходите на ES2015
0
|
|
|
5 / 5 / 0
Регистрация: 07.06.2012
Сообщений: 111
|
||
| 14.01.2017, 19:33 [ТС] | ||
|
0
|
||
|
30 / 28 / 14
Регистрация: 06.01.2016
Сообщений: 161
|
|
| 14.01.2017, 20:00 | |
|
На самом деле подымаются, но там этот механизм работает иначе.
1
|
|
| 14.01.2017, 20:00 | |
|
Помогаю со студенческими работами здесь
6
Добавление класса блоку при его появление в области видимости окна браузера
Масштабирование области видимости Области видимости в Builder Области видимости элементов Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
Символьное дифференцирование
igorrr37 13.02.2026
/ *
Логарифм записывается как: (x-2)log(x^2+2) - означает логарифм (x^2+2) по основанию (x-2).
Унарный минус обозначается как !
в-строка - входное арифметическое выражение в инфиксной(обычной). . .
|
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
|
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу,
и светлой Луне.
В мире
покоя нет
и люди
не могут жить в тишине.
А жить им немного лет.
|
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила»
«Время-Деньги»
«Деньги -Пуля»
|
|
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога
Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
|
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога
Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
|
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL3_image
8Observer8 10.02.2026
Содержание блога
Библиотека SDL3_image содержит инструменты для расширенной работы с изображениями. Пошагово создадим проект для загрузки изображения формата PNG с альфа-каналом (с прозрачным. . .
|
Установка Qt-версии Lazarus IDE в Debian Trixie Xfce
volvo 10.02.2026
В общем, достали меня глюки IDE Лазаруса, собранной с использованием набора виджетов Gtk2 (конкретно: если набирать текст в редакторе и вызвать подсказку через Ctrl+Space, то после закрытия окошка. . .
|