this
никогда не подразумевается в JavaScript, как в некоторых других языках. Хотя есть способы сделать это, например, используя оператор with
:
init: function () {
console.log("init: Let's call the callMe method...");
// Make `this` implicit (SEE BELOW, not recommended)
with (this) {
// Works
callMe();
}
},
... это вообще плохая идея . Дуглас Крокфорд, вероятно, написал одно из лучших описаний , почему это плохая идея, которую вы можете найти здесь . По сути, использование with
делает почти невозможным сказать, что будет делать код (и замедляет код, если вы сделаете что-нибудь еще в этом with
утверждении, которое не приходит из this
объект).
Это не единственный способ, которым JavaScript this
отличается от некоторых других языков. В JavaScript this
полностью определяется как как функция называется , а не там, где функция определена . Когда вы делаете this.callMe()
(или эквивалент this["callMe"]()
, или, конечно, foo.callMe()
и т. Д.), Происходит две вещи: ссылка на функцию извлекается из свойства, и функция вызывается в специальный способ установить this
в качестве объекта, из которого получено свойство. Если вы не вызываете функцию через свойство таким способом, то при вызове не устанавливается никакого конкретного значения this
, и вы получаете значение по умолчанию (которое является глобальным объектом; window
в браузерах). Это акт совершения вызова, который устанавливает, что this
. Я подробно изучил это в нескольких статьях в моем блоге: здесь и здесь .
Это (без каламбура) можно сделать еще яснее, если взглянуть на функции JavaScript call
и apply
, которые доступны для всех функциональных объектов. Если я сделаю это:
callMe.call({});
... вызовет функцию callMe
с пустым объектом ({}
) как this
.
Так что, в основном, привыкайте к набору this
. :-) Все еще полезно иметь свойства и методы, связанные с объектом, даже без синтаксического удобства (и путаницы!) Неявного this
.