Javascript.RU

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

this и литеральная нотация
Закончил учебник ч.1, но не смог найти ответа на следующий вопрос.
Почему следующей код возвращает "undefined" вместо значения свойства?

var obj = {
foo: 15,
bar: this.foo
};

obj.bar //undefined вместо 15

Я понимаю что нужно поместить "this.foo" в тело функции, но не до конца понимаю почему this в данном случае получает глобальный объект. Тот же объект созданный при помощи оператора new - передает контекст как и ожидается.

Последний раз редактировалось Doberq, 10.04.2013 в 13:02.
Ответить с цитированием
  #2 (permalink)  
Старый 10.04.2013, 13:01
Профессор
Отправить личное сообщение для zebra Посмотреть профиль Найти все сообщения от zebra
 
Регистрация: 14.09.2011
Сообщений: 523

В конце кода добавьте alert(this) и посмотрите, что там находится
Ответить с цитированием
  #3 (permalink)  
Старый 10.04.2013, 13:17
Профессор
Посмотреть профиль Найти все сообщения от Антон Крамолов
 
Регистрация: 11.04.2012
Сообщений: 255

this - это объект window, this.foo == window.foo == foo из глобальной обласьти видимости
Ответить с цитированием
  #4 (permalink)  
Старый 10.04.2013, 13:36
Новичок на форуме
Отправить личное сообщение для Doberq Посмотреть профиль Найти все сообщения от Doberq
 
Регистрация: 10.04.2013
Сообщений: 4

Вы должно быть недостаточно внимательно прочитали вопрос. Я ведь написал что в данном случае this получает глобальный объект. Почему при создании объекта с помощью литеральной нотации - this получает window?
Ответить с цитированием
  #5 (permalink)  
Старый 10.04.2013, 13:43
что-то знаю
Отправить личное сообщение для devote Посмотреть профиль Найти все сообщения от devote
 
Регистрация: 24.05.2009
Сообщений: 5,176

Сообщение от Doberq
Почему при создании объекта с помощью литеральной нотации - this получает window?
потому что объект еще не создан, как по вашему интерпретатор получит значение у еще не существующего объекта? потому и берет текущий контекст вызывающего создание объекта.
__________________
хм Russians say завтра but завтра doesn't mean "tomorrow" it just means "not today."
HTML5 history API рассширение для браузеров не поддерживающих pushState, replaceState
QSA CSS3 Selector Engine
Ответить с цитированием
  #6 (permalink)  
Старый 10.04.2013, 15:00
Новичок на форуме
Отправить личное сообщение для Doberq Посмотреть профиль Найти все сообщения от Doberq
 
Регистрация: 10.04.2013
Сообщений: 4

Цитата:
потому что объект еще не создан
А литеральная нотация разве не один из способов создания объекта? Объект ведь существует в памяти и переменная obj на него ссылается.

Последний раз редактировалось Doberq, 10.04.2013 в 15:02.
Ответить с цитированием
  #7 (permalink)  
Старый 10.04.2013, 15:04
что-то знаю
Отправить личное сообщение для devote Посмотреть профиль Найти все сообщения от devote
 
Регистрация: 24.05.2009
Сообщений: 5,176

Сообщение от Doberq
А литеральная нотация разве не один из способов создания объекта? Объект ведь существует в памяти и переменная b на него ссылается.
объект считается созданным после того как все свойства внутри {} будут про инициализированы.

var o = {a: 1, b: this.a} // fail

var o = {a: 1}
o.b = o.a; // good

var o = {a: 1, get b() {return this.a}} // good
__________________
хм Russians say завтра but завтра doesn't mean "tomorrow" it just means "not today."
HTML5 history API рассширение для браузеров не поддерживающих pushState, replaceState
QSA CSS3 Selector Engine
Ответить с цитированием
  #8 (permalink)  
Старый 10.04.2013, 16:12
Аватар для danik.js
Профессор
Отправить личное сообщение для danik.js Посмотреть профиль Найти все сообщения от danik.js
 
Регистрация: 11.09.2010
Сообщений: 8,804

Сообщение от Doberq
Почему при создании объекта с помощью литеральной нотации - this получает window?
А почему должно быть иначе? this указыает на контекст исполнения. Если функция исполяется в контексте window, то this указывает на window. Все же логично, не?
Ответить с цитированием
  #9 (permalink)  
Старый 10.04.2013, 16:53
Аватар для megaupload
Профессор
Отправить личное сообщение для megaupload Посмотреть профиль Найти все сообщения от megaupload
 
Регистрация: 18.01.2013
Сообщений: 1,098

потому что литеральная нотация описана в контексте window - кэп

var obj = {тутИмяСвойства: a(тут).тo[что].вернет(это, выражение, выполненное * (в[текущем] + контексте) )}

Последний раз редактировалось megaupload, 10.04.2013 в 16:55.
Ответить с цитированием
  #10 (permalink)  
Старый 11.04.2013, 00:01
Новичок на форуме
Отправить личное сообщение для Doberq Посмотреть профиль Найти все сообщения от Doberq
 
Регистрация: 10.04.2013
Сообщений: 4

megaupload,
Спасибо, просто для меня это было не так очевидно, помогла Ваша фраза "нотация описана в контексте window" и соответственно следующий код, из которого видно что для нотации важен контекст объявления (например при использовании оператора new - не важно в каком контексте мы инициализируем объект):
var A = function(){
    this.b = 15;
    this.c = {
        d : this.b,
        b : 24
    }
};

var obj = new A;
obj.c.d //15


danik.js, и где же в моем примере функция вызывается в контексте window?

devote, спасибо за познавательный пример с геттером.

Последний раз редактировалось Doberq, 11.04.2013 в 00:03.
Ответить с цитированием
Ответ



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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Prototype. Одноблочное определение псевдокласса. Литеральная форма не робит. Почему? GuardCat Общие вопросы Javascript 6 03.10.2011 13:46