Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 20.07.2012, 12:16
Интересующийся
Отправить личное сообщение для dump Посмотреть профиль Найти все сообщения от dump
 
Регистрация: 14.07.2011
Сообщений: 26

Почему 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....
Ответить с цитированием
  #2 (permalink)  
Старый 20.07.2012, 12:24
Аватар для vadim5june
Студент
Отправить личное сообщение для vadim5june Посмотреть профиль Найти все сообщения от vadim5june
 
Регистрация: 30.04.2012
Сообщений: 1,113

так как у Вас здесь объектов нет то 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

Последний раз редактировалось vadim5june, 20.07.2012 в 12:38.
Ответить с цитированием
  #3 (permalink)  
Старый 20.07.2012, 14:22
Интересующийся
Отправить личное сообщение для dump Посмотреть профиль Найти все сообщения от dump
 
Регистрация: 14.07.2011
Сообщений: 26

Цитата:
так как у Вас здесь объектов нет
Но функция f() вызывается в контексте функции d(),следовательно, она является свойством объекта активации функции d(), поэтому this в первом случае должно указывать на объект активации функции d(). Разве объект активации не считается объектом?
Ответить с цитированием
  #4 (permalink)  
Старый 20.07.2012, 14:49
Аватар для vadim5june
Студент
Отправить личное сообщение для vadim5june Посмотреть профиль Найти все сообщения от vadim5june
 
Регистрация: 30.04.2012
Сообщений: 1,113

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

Последний раз редактировалось vadim5june, 20.07.2012 в 14:55.
Ответить с цитированием
  #5 (permalink)  
Старый 20.07.2012, 16:01
Интересующийся
Отправить личное сообщение для dump Посмотреть профиль Найти все сообщения от dump
 
Регистрация: 14.07.2011
Сообщений: 26

Так ведь функция определённая внутри другой функции, считается её локальной переменной, а следовательно свойством объекта активации? Выходит, что объект активации не принимается в расчёт?
Ответить с цитированием
  #6 (permalink)  
Старый 21.07.2012, 04:32
Профессор
Отправить личное сообщение для oneguy Посмотреть профиль Найти все сообщения от oneguy
 
Регистрация: 31.05.2012
Сообщений: 396

Если функция вызывается обычным способом, не как метод, то this получает значение глобального объекта (или undefined в строгом режиме).
То, что вы называете объектом активации функции, в спецификации называется лексическим окружением. Оно является типом спецификации в отличии от языковых типов. Лексические окружения не являются объектами в понимании Джавакрипта и не могут могут возвращаться выражениями. Функция f() действительно вызывается в контексте функции d(), но передаваемый аргумент this определяется по другим правилам, одно из которых я написал выше.
Ответить с цитированием
  #7 (permalink)  
Старый 21.07.2012, 04:39
Профессор
Отправить личное сообщение для oneguy Посмотреть профиль Найти все сообщения от oneguy
 
Регистрация: 31.05.2012
Сообщений: 396

Сообщение от vadim5june Посмотреть сообщение
Таким образом, при выполнении функции всегда соблюдается условие typeof this == 'object'
В строгом режиме - не всегда. В строгом режиме при вызове функции с помощью метода call аргумент this передаётся как есть.
Ответить с цитированием
  #8 (permalink)  
Старый 21.07.2012, 12:26
Аватар для nerv_
junior
Отправить личное сообщение для nerv_ Посмотреть профиль Найти все сообщения от nerv_
 
Регистрация: 29.11.2011
Сообщений: 3,924

http://forum.htmlbook.ru/index.php?s...dpost&p=262859
__________________
Чебурашка стал символом олимпийских игр. А чего достиг ты?
Тишина - самый громкий звук
Ответить с цитированием
Ответ



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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Почему не получается передать объект ui в функцию? CandyDandy Events/DOM/Window 1 26.03.2012 18:58
Название ячейки таблицы Questioner Общие вопросы Javascript 6 16.02.2011 09:58
Возможна ли смена типа созданного объекта в Javascript? phprus Общие вопросы Javascript 9 04.07.2009 02:41
глюк форума Gvozd Сайт Javascript.ru 11 18.03.2009 14:37
Помогите! Почему в Opera js-код работает с ошибкой. В IE все нормально. maxonline Events/DOM/Window 4 21.11.2008 12:39