Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   this и литеральная нотация (https://javascript.ru/forum/misc/37173-i-literalnaya-notaciya.html)

Doberq 10.04.2013 13:00

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

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

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

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

zebra 10.04.2013 13:01

В конце кода добавьте alert(this) и посмотрите, что там находится

Антон Крамолов 10.04.2013 13:17

this - это объект window, this.foo == window.foo == foo из глобальной обласьти видимости

Doberq 10.04.2013 13:36

Вы должно быть недостаточно внимательно прочитали вопрос. Я ведь написал что в данном случае this получает глобальный объект. Почему при создании объекта с помощью литеральной нотации - this получает window?

devote 10.04.2013 13:43

Цитата:

Сообщение от Doberq
Почему при создании объекта с помощью литеральной нотации - this получает window?

потому что объект еще не создан, как по вашему интерпретатор получит значение у еще не существующего объекта? потому и берет текущий контекст вызывающего создание объекта.

Doberq 10.04.2013 15:00

Цитата:

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

devote 10.04.2013 15:04

Цитата:

Сообщение от 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

danik.js 10.04.2013 16:12

Цитата:

Сообщение от Doberq
Почему при создании объекта с помощью литеральной нотации - this получает window?

А почему должно быть иначе? this указыает на контекст исполнения. Если функция исполяется в контексте window, то this указывает на window. Все же логично, не?

megaupload 10.04.2013 16:53

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

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

Doberq 11.04.2013 00:01

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, спасибо за познавательный пример с геттером.


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