Модераторы: Sardar, Aliance
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Вопрос про this, (про "это") 
:(
    Опции темы
stup
Дата 18.4.2007, 18:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 56
Регистрация: 17.4.2007

Репутация: нет
Всего: 1



Добрый день!

У меня возник вопрос про работу ключевого слова this. Итак, 2 фрагмента кода: 
Код

<html>

<script type="text/javascript">
    function onClickF(){
        alert("!!!");
        this.innerHTML = "It's working!!!!"
        alert(this.innerHTML);
    }
</script>
<body>
<div onClick="javascript:onClickF()">
MyDiv
</div>


</body>
</html>


И:

Код

<html>
    <script>
        function clickListener(event) {
            alert(this.id);
        }

        function load() {
            document.getElementById('work').onclick = clickListener;
        }
    </script>
    <body onload = "load();">
        <img style="width: 100px; height: 100px;" id="work"/>
    </body>
</html>


Вопрос: Почему в первом случае this ссылается на объект-функцию, а во втором на объект img ?
PM MAIL   Вверх
szz
Дата 18.4.2007, 19:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1289
Регистрация: 31.5.2005
Где: Moscow, Jerusalem

Репутация: нет
Всего: 33



Потому что в первом случае ты вызываешь функцию, а во втором присваиваешь анонимно как метод объекта. А если он метод, то this - объект, методом которого является функция.


--------------------
PM   Вверх
vasac
Дата 18.4.2007, 20:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1060
Регистрация: 4.5.2006

Репутация: 13
Всего: 36



Лучше сказать не вызывается, как метод объекта, а вызывается в контексте объекта.
В первом случае в контексте div, во втором в контексте img.
Что означает "в первом случае this ссылается на объект-функцию" мне не понятно. Откуда у функции взялся innerHTML?
PM WWW   Вверх
Mymik
Дата 18.4.2007, 20:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1474
Регистрация: 12.5.2006
Где: Lamer-центер

Репутация: 11
Всего: 78



в первом случаи как метод window, а во втором случаи как метод объекта img 


--------------------
ICQ ::            857-857
E-mail ::         mymik[at]inbox[dot]ru 
HomaPage ::  http://localhost/

:to_become_senile  :this
PM MAIL WWW ICQ   Вверх
stup
Дата 18.4.2007, 23:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 56
Регистрация: 17.4.2007

Репутация: нет
Всего: 1



В том то и дело, что в контексте div этот метод не вызывается, содержимое дива не меняется. Не могли бы вы объяснить как именно работает this, в частности, куда именно он ссылается.
PM MAIL   Вверх
Zeroglif
Дата 19.4.2007, 00:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 644
Регистрация: 22.9.2005

Репутация: 28
Всего: 66



Цитата(stup @  18.4.2007,  23:27 Найти цитируемый пост)
куда именно он ссылается


Чтобы было понятно, измени код на:

Код

<div onClick="alert(this.onclick);onClickF()">

Ты увидишь в алерте, что автоматом создаётся вспомогательная функция, телом которой является то, что написано в атрибуте дива. То есть, при первоначальном вызове ожидаемый тобой this будет передан именно в эту функцию, внутри которой можно с ним работать, но уже дальше функция onClickF вызывается сама по себе, у неё своё собственное значение this, никакой связи с предыдущим. Если сильно упростить ситуацию, то можно представить её так:

Код

div.onclick();     //-> значением this является div
window.onClickF(); //-> значением this является window (глобальный объект)

Это издержки данного старейшего способа регистрации события непосредственно в коде элемента, "нужный" this приходится руками передавать аргументом... 



PM MAIL WWW   Вверх
vasac
Дата 19.4.2007, 07:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1060
Регистрация: 4.5.2006

Репутация: 13
Всего: 36



Цитата(stup @  18.4.2007,  23:27 Найти цитируемый пост)
В том то и дело, что в контексте div этот метод не вызывается, содержимое дива не меняется.

Да, точно, не досмотрел.
Можно еще так извратиться:
Код

<div onClick="onClickF.apply(this)">

И не пиши "javascript:" в on-атрибутах.
PM WWW   Вверх
stup
Дата 19.4.2007, 10:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 56
Регистрация: 17.4.2007

Репутация: нет
Всего: 1



Ага, т.е. this всегда ссылается на объект, вызвавший данную функцию-объект. Меня запутало то, что браузер заворачивает содержимое onClick в еще один объект, который и присваивает событию onClick. Но в таком случае мне непонятно, как работают конструкторы.
PM MAIL   Вверх
Zeroglif
Дата 19.4.2007, 12:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 644
Регистрация: 22.9.2005

Репутация: 28
Всего: 66



Цитата(stup @  19.4.2007,  10:58 Найти цитируемый пост)
Но в таком случае мне непонятно, как работают конструкторы.

Что именно не понятно?

Цитата(stup @  19.4.2007,  10:58 Найти цитируемый пост)
Ага, т.е. this всегда ссылается на объект, вызвавший данную функцию-объект.

Близко, но не обязательно. Применительно к функциям значение this зависит от точки вызова (от того, как и где происходит вызов функции).

PM MAIL WWW   Вверх
stup
Дата 19.4.2007, 13:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 56
Регистрация: 17.4.2007

Репутация: нет
Всего: 1



Код

function myObject(firstProperty, secondProperty) {
       this.firstProperty = firstProperty;
       this.secondProperty = secondProperty;
...
}


Я думал, что этот код добавляет к объекту myObject нужные свойства и устанавливает их значения. Далее же при создании 
Код

obj = new myObject(...)

создается копия шаблона и присваивается экземпляру.  Если же this ссылкается на объект, вызвавший данную функцию, то я перестаю что либо понимать.
PM MAIL   Вверх
Zeroglif
Дата 19.4.2007, 14:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 644
Регистрация: 22.9.2005

Репутация: 28
Всего: 66



Цитата(stup @  19.4.2007,  13:58 Найти цитируемый пост)
создается копия шаблона и присваивается экземпляру.  Если же this ссылкается на объект, вызвавший данную функцию, то я перестаю что либо понимать.


Не путай функцию, которая конструирует с функцией, которая не конструирует. Если слева оператор new, то конструктором создаётся новый объект и ссылка на этот объект становится значением this.

PM MAIL WWW   Вверх
stup
Дата 19.4.2007, 16:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 56
Регистрация: 17.4.2007

Репутация: нет
Всего: 1



Хе. Если есть оператор new, то объект как бы вызывает функцию-конструктор, и this в ней как раз и ссылается на наш объект, т.е. конструктор как раз и "собирает" экземпляр?
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Форум для вопросов, которые имеются в справочниках, но их поиск вызвал затруднения, или для разработчика требуется совет или просьба отыскать ошибку. Напоминаем: 1) чётко формулируйте вопрос, 2) приведите пример того, что уже сделано, 3) укажите явно, нужен работающий пример или подсказка о том, где найти информацию.
 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | JavaScript: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.2220 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.