Как работает ключевое слово this?
В Си-подобных языках программирования this ссылается на текущий объект. Т.е. на объект, которому принадлежит метод, в котором используется слово this. Однако в JavaScript методы или функции могут не принадлежать объекту, могут принадлежать нескольким объектам или менять объекты, которым принадлежат. Поэтому слово this указывает на контекст вызова функции.
document.writeln(“Windows height is ” +this.innerHeight);
This можно использовать глобально, т.е. без привязки к конкретному объекту или классу. В этом случае this ссылается на глобальный объект Object. Глобальный объект предоставляется средой исполнения (или окружения). Если ваш код будет выполнятся в браузере, то this будет указывать на объект Window. Если в node.js то на объект Global.
Точно также this будет обращаться к глобальному контексту, объекту Window, в нашем случае, окну браузера, если использовать this в глобальной функции (функции, которая не принадлежит никакому объекту).
function get Content Width(){
return this.innerWidth;
}
Если же функция объявлена локально, то есть является методом объекта. И тогда слово this будет ссылаться на контекст этого объекта и сможет использовать свойства и другие методы текущего объекта.
var Cat = {
name: “Sally”,
whatToSay: “May”,
sayMay: function() {
return this.whatToSay;
}
}
document. writeln(cat.sayMay());
В JavaScript методы не обязательно принадлежат какому-то объекту. Поэтому после объявления функции, мы можем указать какому объекту или объектам принадлежит данная функция. Это называется установкой контекста. Например:
var Robot = {
name: “Linda”
};
function DoMath() {
return 5*7;
};
Robot.DoMath = DoMath();
Здесь мы создаем свойство DoMath присваиваем глобальную функцию DoMath(). И меняем контекст выполения для функции DoMath() с глобального на контекст объекта Robot.
JavaScript крайне гибок в аспекте смены контекста для функции. Это значит, что мы можем менять контекст функции после ее объявления. Мы можем даже создать объект без метода. И потом назначить объекту без метода этот метод из объекта, имеющего его. Например:
var Robot = {
name: “Linda”,
DoMath: function () {
return 5*7;
}
};
var Android = {
name: “B4”
};
Android.DoMath = Robot.DoMath; // 111
document.writeln(Robot.DoMath());
document.writeln(Android.DoMath()); // 222
Присваивание контекста метода DoMath() объекту Android. Но такой синтаксис наглядный, но используется редко. Присвоение нового контекста вызова делают прямо в месте вызова при помощи функции call(), где первым параметром передают контекст вызова. Например вместо строк // 111 и // 222 пишут одну строку, вот так:
document.writeln(Robot.DoMath(Android));