Ключевое слово thisКак работает ключевое слово 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));