Форум программистов, компьютерный форум, киберфорум
JavaScript
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.78/9: Рейтинг темы: голосов - 9, средняя оценка - 4.78
БТР - мой друг
 Аватар для Hagrael
333 / 277 / 47
Регистрация: 07.01.2010
Сообщений: 1,932

this в функциях

06.12.2010, 15:23. Показов 1907. Ответов 11
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Столкнулся с такой вещью - вот такой код:
JavaScript
1
2
3
4
5
6
7
8
9
a={
    b : function() {
        function c() {
            alert(this)
        }
        c()
    }
}
a.b()
выдаёт мне [Object DOMWindow]. Но почему? this ведь должно указывать на объект a вроде бы.
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
06.12.2010, 15:23
Ответы с готовыми решениями:

О функциях
Например в Паскале я могу передать аргумент просто(создается копия которая не имеет отношения к передоваемой переменной) или по...

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

Указатели в функциях
Проблема с указателями в классе дерево. Есть такой вот класс: template <class T> class tree_elem { public: T value; ...

11
 Аватар для Good-bad man
256 / 234 / 38
Регистрация: 31.10.2010
Сообщений: 504
06.12.2010, 16:00
JavaScript
1
2
3
4
5
6
7
8
9
10
11
12
a={
    b : function() {
        var th = this;
        alert(this) // object Object
        function c() {
            alert(this) // object Window
            alert(th) // object Object
        }
        c()
    }
}
a.b()
2
БТР - мой друг
 Аватар для Hagrael
333 / 277 / 47
Регистрация: 07.01.2010
Сообщений: 1,932
06.12.2010, 16:02  [ТС]
Good-bad man, не, это я понимаю, а почему такое поведение у локальных функций?
0
 Аватар для Vovan-VE
13210 / 6599 / 1041
Регистрация: 10.01.2008
Сообщений: 15,069
06.12.2010, 17:04
Hagrael, Привязка объекта к функции имеет место только в момент вызова. Функция всегда вызывается в контексте какого-то объекта.
JavaScript
1
2
3
r = объект.функция();
r = функция.call(объект, аргумент, ...);
r = функция.apply(объект, массивАргументов);
Если просто вызывать функцию() , то в this будет глобальный объект (window в данном случае).
2
БТР - мой друг
 Аватар для Hagrael
333 / 277 / 47
Регистрация: 07.01.2010
Сообщений: 1,932
06.12.2010, 17:53  [ТС]
Vovan-VE, что-то я не очень понял. Ведь функция имеет доступ к переменным род. функции, а значит и к this должна иметь доступ.
0
 Аватар для Vovan-VE
13210 / 6599 / 1041
Регистрация: 10.01.2008
Сообщений: 15,069
06.12.2010, 18:17
Hagrael, а this это не переменная Это ключевое слово read only.

Добавлено через 1 минуту
Или по-другому для ясности: this всегда локально и в каждой функции своё, аналогично arguments.
1
БТР - мой друг
 Аватар для Hagrael
333 / 277 / 47
Регистрация: 07.01.2010
Сообщений: 1,932
06.12.2010, 18:37  [ТС]
Vovan-VE, следственно функция c имеет своё this, а не наследует его от b, так?
0
 Аватар для Vovan-VE
13210 / 6599 / 1041
Регистрация: 10.01.2008
Сообщений: 15,069
06.12.2010, 18:53
Цитата Сообщение от Hagrael Посмотреть сообщение
функция c имеет своё this, а не наследует его от b, так?
Да, своё локальное this, значение которого инициализируется в момент вызова с().
1
БТР - мой друг
 Аватар для Hagrael
333 / 277 / 47
Регистрация: 07.01.2010
Сообщений: 1,932
06.12.2010, 18:55  [ТС]
Vovan-VE, и всё-таки, не могли бы вы сказать, по каким правилам эта переменная инициализируется?
0
 Аватар для Vovan-VE
13210 / 6599 / 1041
Регистрация: 10.01.2008
Сообщений: 15,069
06.12.2010, 18:58
Hagrael, см. пост #4. this в любом случае в момент вызова будет инициализировано чем-то. Либо указанным объектом, либо глобальным объектом (window).
0
БТР - мой друг
 Аватар для Hagrael
333 / 277 / 47
Регистрация: 07.01.2010
Сообщений: 1,932
06.12.2010, 19:03  [ТС]
Vovan-VE, знач если функция принадлежит объекту, то this в ней - это этот объект. Если вызвана через call, apply, там аналогично с посылаемым объектом. Если функция вызвана как конструктор, то this - это конструируемый объект, если функция локальна, то window. Так?
0
 Аватар для Vovan-VE
13210 / 6599 / 1041
Регистрация: 10.01.2008
Сообщений: 15,069
10.12.2010, 19:29
Цитата Сообщение от Hagrael Посмотреть сообщение
знач если функция принадлежит объекту...
если функция локальна, то window
Функция не принадлежит объекту. Функция может храниться в свойстве объекта. Можно и так и эдак вызвать.

К примеру, код не будет выдавать желаемого результата
JavaScript
1
2
3
4
5
6
7
var a = {
    b : 42,
    f : function() {
        alert(this.b);
    }
};
setTimeout(a.f, 0);
Здесь мы просто из a.f считываем функцию и больше a никак не используется. Надо было
JavaScript
1
2
3
setTimeout(function() {
    a.f();
}, 0);
Вот тогда функция, которая хранится в a.f, будет вызвана в контексте a .
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
10.12.2010, 19:29
Помогаю со студенческими работами здесь

Ошибка в функциях
#include<iostream> #include<conio.h> #include<stdio.h> #include<cmath> #include<windows.h> using namespace std; void p(int...

Запуталась в функциях
В общем, программа компилируется, но не работают функции (то ли указала их не так...). При запуске только черный экран. Помогите,...

Переменные в функциях
Разбираясь с передачей и приемом функциями различных типов данных, столкнулся с такой проблемой.Написал 2 похожие функции и стал объявлять...

Об однородных функциях
Здравствуйте! Насколько мне известно функция называется однородной, если F(cx)=cF(x). Можно ли привести примеры однородных функций,...

Вопрос о функциях
Что делают эти функции get-value increment-char-counter get-ident get-numbers


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
12
Ответ Создать тему
Новые блоги и статьи
BOINC: 22 года — и всё ещё работает
Programma_Boinc 12.03.2026
BOINC: 22 года — и всё ещё работает Дэвид Андерсон написал ретроспективу. Кратко: в 2001 году он ушёл из United Devices, где был CTO, и за несколько месяцев написал ядро BOINC — клиент, сервер,. . .
SDL3 для Desktop (MinGW): Создаём пустое окно с нуля для 2D-графики на SDL3, Си и C++
8Observer8 10.03.2026
Содержание блога Финальные проекты на Си и на C++: hello-sdl3-c. zip hello-sdl3-cpp. zip Результат:
Установка CMake и MinGW 13.1 для сборки С и C++ приложений из консоли и из Qt Creator в EXE
8Observer8 10.03.2026
Содержание блога MinGW - это коллекция инструментов для сборки приложений в EXE. CMake - это система сборки приложений. Здесь описаны базовые шаги для старта программирования с помощью CMake и. . .
Как дизайн сайта влияет на конверсию: 7 решений, которые реально повышают заявки
Neotwalker 08.03.2026
Многие до сих пор воспринимают дизайн сайта как “красивую оболочку”. На практике всё иначе: дизайн напрямую влияет на то, оставит человек заявку или уйдёт через несколько секунд. Даже если у вас. . .
Модульная разработка через nuget packages
DevAlt 07.03.2026
Сложившийся в . Net-среде способ разработки чаще всего предполагает монорепозиторий в котором находятся все исходники. При создании нового решения, мы просто добавляем нужные проекты и имеем. . .
Модульный подход на примере F#
DevAlt 06.03.2026
В блоге дяди Боба наткнулся на такое определение: В этой книге («Подход, основанный на вариантах использования») Ивар утверждает, что архитектура программного обеспечения — это структуры,. . .
Управление камерой с помощью скрипта OrbitControls.js на Three.js: Вращение, зум и панорамирование
8Observer8 05.03.2026
Содержание блога Финальная демка в браузере работает на Desktop и мобильных браузерах. Итоговый код: orbit-controls-threejs-js. zip. Сканируйте QR-код на мобильном. Вращайте камеру одним пальцем,. . .
SDL3 для Web (WebAssembly): Синхронизация спрайтов SDL3 и тел Box2D
8Observer8 04.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-sync-physics-sprites-sdl3-c. zip На первой гифке отладочные линии отключены, а на второй включены:. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru