Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Почему this всё время указывает на глобалный объект? (https://javascript.ru/forum/misc/29996-pochemu-vsjo-vremya-ukazyvaet-na-globalnyjj-obekt.html)

dump 20.07.2012 12:16

Почему this всё время указывает на глобалный объект?
 
Вот код:

function d(){var z=1; function f(){var z=4; alert(this.z);};f();return f;}
var x;
var z=2;
x=d();
x();
почему он два раза подряд выводит 2? Хотя должен бы сначала 1, а потом 2....

vadim5june 20.07.2012 12:24

так как у Вас здесь объектов нет то this указывает на window
если написать так
function d(){this.z=1;this.f= function (){var z=4; alert(this.z);};this.f();return this.f;}
var x;
var z=2;
x= new d();
x();

то вернет 1 и 2

dump 20.07.2012 14:22

Цитата:

так как у Вас здесь объектов нет
Но функция f() вызывается в контексте функции d(),следовательно, она является свойством объекта активации функции d(), поэтому this в первом случае должно указывать на объект активации функции d(). Разве объект активации не считается объектом?

vadim5june 20.07.2012 14:49

Цитата:

Сообщение от dump (Сообщение 190271)
Но функция f() вызывается в контексте функции d(),

функция вызывается в контексте объекта а не функции=если нет то в контексте объекта window
http://javascript.ru/Function/call
Таким образом, при выполнении функции всегда соблюдается условие typeof this == 'object'

dump 20.07.2012 16:01

Так ведь функция определённая внутри другой функции, считается её локальной переменной, а следовательно свойством объекта активации? Выходит, что объект активации не принимается в расчёт?

oneguy 21.07.2012 04:32

Если функция вызывается обычным способом, не как метод, то this получает значение глобального объекта (или undefined в строгом режиме).
То, что вы называете объектом активации функции, в спецификации называется лексическим окружением. Оно является типом спецификации в отличии от языковых типов. Лексические окружения не являются объектами в понимании Джавакрипта и не могут могут возвращаться выражениями. Функция f() действительно вызывается в контексте функции d(), но передаваемый аргумент this определяется по другим правилам, одно из которых я написал выше.

oneguy 21.07.2012 04:39

Цитата:

Сообщение от vadim5june (Сообщение 190282)
Таким образом, при выполнении функции всегда соблюдается условие typeof this == 'object'

В строгом режиме - не всегда. В строгом режиме при вызове функции с помощью метода call аргумент this передаётся как есть.

nerv_ 21.07.2012 12:26

http://forum.htmlbook.ru/index.php?s...dpost&p=262859


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