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

iamme 12.11.2017 19:06

Вопрос про замыкание
 
или не про замыкание.
Почему здесь функция видит переменную 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 ),
...........
}


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

Nexus 12.11.2017 19:18

Цитата:

Сообщение от iamme
А здесь функция не видит переменную userName

Потому что "userName" не переменная, а свойство объекта.
Получить значение можно так: "this.userName".

И не трогали бы вы глобальный объект window.

iamme 12.11.2017 19:56

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

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

Lion777 13.11.2017 02:07

к твоему user
var user = {
  userName: 'Василий',
  display: function() {
    alert(user.userName);
  }
}
user.display();

Erolast 13.11.2017 06:44

Цитата:

Сообщение от iamme (Сообщение 469896)
Или они не аналогичны?

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

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

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

iamme 13.11.2017 07:04

Цитата:

Сообщение от Lion777 (Сообщение 469926)
к твоему user
var user = {
  userName: 'Василий',
  display: function() {
    alert(user.userName);
  }
}
user.display();

лексическое окружение есть у области видимости, а не объекта, так? Это то, что создается при запуске функции. userName относится к структуре user, да, но не к лексическому окружению user.

Все переменные и параметры функций являются свойствами объекта переменных LexicalEnvironment. Каждый запуск функции создает новый такой объект. На верхнем уровне им является «глобальный объект», в браузере – window.
При создании функция получает системное свойство [[Scope]], которое ссылается на LexicalEnvironment, в котором она была создана.
При вызове функции, куда бы её ни передали в коде – она будет искать переменные сначала у себя, а затем во внешних LexicalEnvironment с места своего «рождения».

Lion777 13.11.2017 19:29

лексическое окружение области видимости, твой 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();

iamme 16.11.2017 14:37

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

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


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