Как раз тогда, когда я думаю, что наконец-то понял область применения Javascript - PullRequest
5 голосов
/ 17 марта 2009

Я сталкиваюсь с чем-то, что иллюстрирует, как я явно еще не понимаю.

Может кто-нибудь объяснить, почему значение «this» меняется следующим образом?

var MyFunc = function(){
    alert(this);
    var innerFunc = function(){
        alert(this);
    }
    innerFunc();
};

new MyFunc();

Ответы [ 5 ]

18 голосов
/ 17 марта 2009

В JavaScript this представляет объект контекста, в котором функция называется , а не область, в которой она была определена (или область, в которой она была вызвана). Для MyFunc это относится к создаваемому новому объекту; но для innerFunc он ссылается на глобальный объект, поскольку при вызове innerFunc не указывается контекст.

Это приводит к путанице с теми, которые используются в Java или аналогичных языках ОО, где this почти всегда ссылается на экземпляр класса, в котором определен вызываемый метод. Просто помните: у JavaScript нет методов. Или классы. Просто объекты и функции.

См. Также: Каково обоснование поведения ключевого слова "this" в JavaScript?

2 голосов
/ 17 марта 2009

Просто сделайте следующее:

var MyFunc = function(){
    var self = this;
    alert(self);
    var innerFunc = function(){
        alert(self);
    }
    innerFunc();
};

new MyFunc();

Таким образом, «я» всегда будет означать это, независимо от того, откуда вы это называете, а это обычно то, что вы хотите.

1 голос
/ 17 марта 2009

Для подробного объяснения закрытий, посетите:

http://www.brockman.se/writing/method-references.html.utf8

г. Брокман ясно иллюстрирует проблему, с которой вы столкнулись. Я читаю эту статью время от времени просто для удовольствия от возможности сказать: «Ага! Я понял!»

Чтобы получить еще более интересные уроки JavaScript, посетите "Wrrrld Wide Web" Дугласа Крокфорда по адресу

http://www.crockford.com/

Как создатель JSON, мистер Крокфорд - человек, когда дело доходит до JavaScript. Он не знает меня, но он научил меня понимать красоту JavaScript, нет, программирования вообще.

Вы настолько близки к тому, чтобы стать намного лучшим программистом, чем сейчас. Я говорю это не в унизительном смысле, а из знания того, как эти два автора бросили вызов моим собственным навыкам.

1 голос
/ 17 марта 2009

В качестве идентификатора «this» не обязательно всегда ссылается на фактическую функцию, поскольку вы можете вызывать функцию с «принудительной» ссылкой this, подумайте о обработчике событий, в котором это будет ссылаться фактический элемент, который вызвал событие.

с использованием

yourFunction.apply(thisReference, arguments)

вы можете вызвать его, когда «this» будет указывать на то, что вы передаете в качестве первого аргумента.

0 голосов
/ 17 марта 2009

На первый взгляд, я бы сказал, что это потому, что внешнее «this» относится к MyFunc, а внутреннее «this» относится к innerFunc.

Тем не менее, Javascript - это не то, в чем у меня есть особый опыт.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...