Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 12.11.2017, 19:06
Аспирант
Отправить личное сообщение для iamme Посмотреть профиль Найти все сообщения от iamme
 
Регистрация: 02.09.2011
Сообщений: 46

Вопрос про замыкание
или не про замыкание.
Почему здесь функция видит переменную aaa
window.aaa="aaa";
var f=function() {
    alert( aaa );
  }


А здесь функция не видит переменную userName
var user = {
  userName: 'Василий',
 

  display: function() {
    alert(userName);
  }
}
user.display();




структуры то аналогичны

window={
  aaa: ""aaa",
  f:  function() {
    alert( aaa ),
...........
}


Или они не аналогичны?

Последний раз редактировалось iamme, 12.11.2017 в 20:01.
Ответить с цитированием
  #2 (permalink)  
Старый 12.11.2017, 19:18
Профессор
Отправить личное сообщение для Nexus Посмотреть профиль Найти все сообщения от Nexus
 
Регистрация: 04.12.2012
Сообщений: 3,795

Сообщение от iamme
А здесь функция не видит переменную userName
Потому что "userName" не переменная, а свойство объекта.
Получить значение можно так: "this.userName".

И не трогали бы вы глобальный объект window.
Ответить с цитированием
  #3 (permalink)  
Старый 12.11.2017, 19:56
Аспирант
Отправить личное сообщение для iamme Посмотреть профиль Найти все сообщения от iamme
 
Регистрация: 02.09.2011
Сообщений: 46

да как получить я знаю.

А this.userName к чьему лексическому окружению относится?

Последний раз редактировалось iamme, 12.11.2017 в 20:09.
Ответить с цитированием
  #4 (permalink)  
Старый 13.11.2017, 02:07
Кандидат Javascript-наук
Отправить личное сообщение для Lion777 Посмотреть профиль Найти все сообщения от Lion777
 
Регистрация: 04.11.2017
Сообщений: 117

к твоему user
var user = {
  userName: 'Василий',
  display: function() {
    alert(user.userName);
  }
}
user.display();
Ответить с цитированием
  #5 (permalink)  
Старый 13.11.2017, 06:44
Аватар для Erolast
Профессор
Отправить личное сообщение для Erolast Посмотреть профиль Найти все сообщения от Erolast
 
Регистрация: 24.09.2013
Сообщений: 1,436

Сообщение от iamme Посмотреть сообщение
Или они не аналогичны?
Не аналогичны. window - особый объект, все его свойства помещаются в глобальную область видимости - то есть, становятся доступны отовсюду без явного указания объекта-владельца.

В node.js, скажем, ту же функцию выполняет объект global.

На практике стараются по возможности избегать манипуляций с глобальным контекстом, потому что сотня-другая видных отовсюду переменных создают путаницу и проблемы с очисткой памяти. Инкапсуляция, все дела.
Ответить с цитированием
  #6 (permalink)  
Старый 13.11.2017, 07:04
Аспирант
Отправить личное сообщение для iamme Посмотреть профиль Найти все сообщения от iamme
 
Регистрация: 02.09.2011
Сообщений: 46

Сообщение от Lion777 Посмотреть сообщение
к твоему user
var user = {
  userName: 'Василий',
  display: function() {
    alert(user.userName);
  }
}
user.display();
лексическое окружение есть у области видимости, а не объекта, так? Это то, что создается при запуске функции. userName относится к структуре user, да, но не к лексическому окружению user.

Все переменные и параметры функций являются свойствами объекта переменных LexicalEnvironment. Каждый запуск функции создает новый такой объект. На верхнем уровне им является «глобальный объект», в браузере – window.
При создании функция получает системное свойство [[Scope]], которое ссылается на LexicalEnvironment, в котором она была создана.
При вызове функции, куда бы её ни передали в коде – она будет искать переменные сначала у себя, а затем во внешних LexicalEnvironment с места своего «рождения».
Ответить с цитированием
  #7 (permalink)  
Старый 13.11.2017, 19:29
Кандидат Javascript-наук
Отправить личное сообщение для Lion777 Посмотреть профиль Найти все сообщения от Lion777
 
Регистрация: 04.11.2017
Сообщений: 117

лексическое окружение области видимости, твой user ссылается на window, а твой userName на window.userName, а тебе надо на window.user.userName, так о каком лексическом окружении ты говоришь, непонятно, теперь понятно ? )) Вообщем твой userName ищет сначала внутри твоей функции, а потом глобально в window, если ты не указываешь в каком окружении искать
var user = {
  userName: 'Василий',
  display: function() {
    alert(window.user.userName);
  }
}
user.display();

или так
var user = {
  userName: 'Василий',
  display: function() {
var userName = "Петя"
    alert(userName);
  }
}
user.display();

или так
var userName = "Федя"
var user = {
  userName: 'Василий',
  display: function() {
    alert(userName);
  }
}
user.display();

ну или так
var user = {
  userName: 'Василий',
  display: function() {
    alert(this.userName);
  }
}
user.display();
Ответить с цитированием
  #8 (permalink)  
Старый 16.11.2017, 14:37
Аспирант
Отправить личное сообщение для iamme Посмотреть профиль Найти все сообщения от iamme
 
Регистрация: 02.09.2011
Сообщений: 46

так разве структуру можно считать областью видимости? Область видимости - это про функции

Про работу у меня вопросов нет, это теоретический вопрос
Ответить с цитированием
Ответ



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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
еще один вопрос про кнопки и события f0rzik Общие вопросы Javascript 15 19.01.2013 23:19
Вопрос про change vitaly63 Общие вопросы Javascript 1 24.12.2012 10:50
Глупый вопрос про if then. Irish.Tippler Общие вопросы Javascript 9 26.07.2012 12:32
вопрос про создание переменной Gamestop Общие вопросы Javascript 2 04.09.2011 21:48
Вопрос: И опять про offsetLeft... sigurd Общие вопросы Javascript 11 04.10.2010 14:06