Javascript.RU

this

Описание, примеры

Оператор this возвращает ссылку на объект, являющийся текущим контекстом вызова. Это позволяет обращаться к свойствам "текущего" объекта: this.property.

Текущий объект не является жестко фиксированным и зависит от контекста вызова функции. Он является, своего рода, скрытым параметром.

Есть четыре различных варианта его передачи.

Тип Способ this
неявно, через вызов метода object.method(...) object
явно, через call function.call(object,...) object
явно, через apply function.apply(object,...) object
неявно, через вызов new new constructor(...) новый, создаваемый объект

Если ни один из этих способов не задействован, то this указывает на глобальный объект: в браузере это window.

Это происходит при вызове функции без объекта: myFunc(params).

При манипуляциях с DOM при помощи javascript, this обычно используется для работы с событиями. При этом значение this указывает на текущий DOM-элемент, в контексте которого вызван обработчик.

Привязка методов

Так как this не привязано жестко к объекту, то можно привязывать один и тот же метод к любым классам.

walk = function() { this.isWalking = true }

function Bird() { /*...*/ }
function Rabbit() { /*...*/ }

Bird.prototype.walk = Rabbit.prototype.walk = walk

new Bird().walk() // в обоих случаях
new Rabbit().walk() // this будет указывать на текущий объект

См. также


Автор: Гость (не зарегистрирован), дата: 29 марта, 2011 - 20:20
#permalink

Здравствуйте, А как быть с многоуровневыми объектами?
Точнее: как получить доступ к старшему объекту?

Допустим:

var o=
{
     subO:
     {
          f: function ()
          {
               this // Вернёт subO
               // А как получить, например o?
          }
     }
}


Автор: Гость (не зарегистрирован), дата: 12 апреля, 2011 - 13:53
#permalink

Если ничего не путаю, необходимо будет обращаться напрямую. чтобы получить subO в f, необходимо обращаться как o.subO, и так далее.


Автор: Mockingbird (не зарегистрирован), дата: 30 ноября, 2012 - 01:00
#permalink

Помогите, пожалуйста. Весь вечер голову ломаю.

function Round(px, py, pR) {
this.x=px;
this.y=py;
this.R=pR;
this.getLength=mGetLength();
}
function mGetLength() {
return this.x;
}
var d=new Round(1, 2, 3);
var f=d.getLength;

Почему возвращает undefined?
если написАть var f=d.x; или var f=d.y; то их возвращает, а вот метод getLength не реализуется почему то


Автор: Вуди (не зарегистрирован), дата: 30 ноября, 2012 - 16:09
#permalink

мне кажется, что ошибка здесь:
"function mGetLength() {
return this.x;
}"
думаю, в данном случае не "Round" выступает в качестве объекта, а "mGetLength".. а у mGetLength параметра "х" нету, поэтому и "undefined".
И вообще странная функция какая-то.. у тебя же уже есть параметр "х", для чего длину добавлять отдельно, да еще и функцией? О_о или я не правильно понял что?


Автор: petruchio (не зарегистрирован), дата: 22 мая, 2013 - 09:33
#permalink

Если кому-то еще интересно, то ошибки две:
this.getLength=mGetLength;

скобки не нужны, если мы хотим, чтоб getLength была не переменной, а методом.

А вот при вызове метода наоборот нужны скобки:
var f=d.getLength();


Автор: Mockingbird (не зарегистрирован), дата: 30 ноября, 2012 - 20:49
#permalink

Там return this.x для примера только, там мат. действие в оригинале должно быть, умножение this.x, this.y и this.pR, к примеру, это я пока для примера поставил, пока разбирался)

"думаю, в данном случае не "Round" выступает в качестве объекта, а "mGetLength".. а у mGetLength параметра "х" нету, поэтому и "undefined"."

Я тоже так думал, кстати, но у меня книга есть, оттуда пример, там так написАно 0_о
А как сделать, чтоб mGetLength обращался за переменной в Round?
Только не сильно меняя код, я именно с назначением методов пытаюсь разобраться


Автор: Гость (не зарегистрирован), дата: 14 января, 2013 - 14:22
#permalink

Попробуй перед функцией this.getLength=mGetLength();
поставить строку that = this;
и внутри функции mGetLength() использовать that вместо this.


Автор: 23W (не зарегистрирован), дата: 9 апреля, 2013 - 15:49
#permalink

Чем равен this внутри eval() ?

var j = 1;
eval("var j = 0; return this.j;");

что вернет eval() ? 1 или 0 ?


Автор: ScalaIsBetter (не зарегистрирован), дата: 26 июня, 2015 - 19:39
#permalink

Доброго времени суток, созрел вопрос. Вот почему this может затеряться при, например, присваивании функции, в которой он прописан, какому-либо другому выражению или переменной? Например:

var obj = { function() { 
    alert (this) 
  } 
};

var method;
( method = obj.go ) (); // undefined ( почему не obj  )

Автор: ScalaIsBetter (не зарегистрирован), дата: 27 июня, 2015 - 12:51
#permalink

Извините, небольшая поправка:

var obj = {go: function() { ...

Автор: Merkury, дата: 1 июля, 2015 - 23:46
#permalink

встречный вопрос, который даст понимание что такое this в яваскрипт...
А в чем разница между методом и функцией?...
Правильно, методы у объектов, и вызов выглядит как obj.go(), т.е. перед go стоит объект. А в вашем примере, какой объект? Вы метод превратили в обычную функцию и выполнили ее.
грубо говоря - this ссылается на тот объект, который стоит перед методом (кроме apply/call), если объекта нет - это функция.


Автор: Гость (не зарегистрирован), дата: 12 апреля, 2022 - 15:43
#permalink

Автор: Гость (не зарегистрирован), дата: 16 апреля, 2022 - 01:05
#permalink

Отправить комментарий

Приветствуются комментарии:
  • Полезные.
  • Дополняющие прочитанное.
  • Вопросы по прочитанному. Именно по прочитанному, чтобы ответ на него помог другим разобраться в предмете статьи. Другие вопросы могут быть удалены.
    Для остальных вопросов и обсуждений есть форум.
P.S. Лучшее "спасибо" - не комментарий, как все здорово, а рекомендация или ссылка на статью.
Содержание этого поля является приватным и не предназначено к показу.
  • Адреса страниц и электронной почты автоматически преобразуются в ссылки.
  • Разрешены HTML-таги: <strike> <a> <em> <strong> <cite> <code> <ul> <ol> <li> <dl> <dt> <dd> <u> <i> <b> <pre> <img> <abbr> <blockquote> <h1> <h2> <h3> <h4> <h5> <p> <div> <span> <sub> <sup>
  • Строки и параграфы переносятся автоматически.
  • Текстовые смайлы будут заменены на графические.

Подробнее о форматировании

CAPTCHA
Антиспам
19 + 0 =
Введите результат. Например, для 1+3, введите 4.
 
Поиск по сайту
Содержание

Учебник javascript

Основные элементы языка

Сундучок с инструментами

Интерфейсы

Все об AJAX

Оптимизация

Разное

Дерево всех статей

Последние комментарии
Последние темы на форуме
Forum