Поиск…
это с простыми объектами
var person = {
  name: 'John Doe',
  age: 42,
  gender: 'male',
  bio: function() {
    console.log('My name is ' + this.name);
  }
};
person.bio(); // logs "My name is John Doe"
var bio = person.bio;
bio(); // logs "My name is undefined"
 В приведенном выше коде person.bio использует контекст ( this ). Когда функция вызывается как person.bio() , контекст передается автоматически, и поэтому он корректно регистрирует «Меня зовут Джон Доу». Однако, назначая функцию переменной, она теряет свой контекст. 
 В нестрогом режиме контекст по умолчанию является глобальным объектом ( window ). В строгом режиме он не undefined . 
Сохранение этого для использования в вложенных функциях / объектах
 Одна общая ошибка заключается в том, чтобы попытаться использовать this во вложенной функции или в объект, где был потерян контекст. 
document.getElementById('myAJAXButton').onclick = function(){
    makeAJAXRequest(function(result){
      if (result) { // success
        this.className = 'success';
      }
    })
}
 Здесь контекст ( this ) теряется во внутренней функции обратного вызова. Чтобы исправить это, вы можете сохранить значение this в переменной: 
document.getElementById('myAJAXButton').onclick = function(){
    var self = this;
    makeAJAXRequest(function(result){
      if (result) { // success
        self.className = 'success';
      }
    })
}
Связывание функции контекста
 Каждая функция имеет метод bind , который создаст обернутую функцию, которая вызовет ее с правильным контекстом. См. Здесь для получения дополнительной информации. 
var monitor = {
  threshold: 5,
  check: function(value) {
    if (value > this.threshold) {
      this.display("Value is too high!");
    }
  },
  display(message) {
    alert(message);
  }
};
monitor.check(7); // The value of `this` is implied by the method call syntax.
var badCheck = monitor.check;
badCheck(15); // The value of `this` is window object and this.threshold is undefined, so value > this.threshold is false
var check = monitor.check.bind(monitor);
check(15); // This value of `this` was explicitly bound, the function works.
var check8 = monitor.check.bind(monitor, 8);
check8(); // We also bound the argument to `8` here. It can't be re-specified.
Твердый переплет
-  Объектом жесткой привязки является «жесткая» ссылка на this.
- Преимущество: полезно, когда вы хотите защитить определенные объекты от потери.
- Пример:
function Person(){
    console.log("I'm " + this.name);
}
var person0 = {name: "Stackoverflow"}
var person1 = {name: "John"};
var person2 = {name: "Doe"};
var person3 = {name: "Ala Eddine JEBALI"};
var origin = Person;
Person = function(){
    origin.call(person0);
}
Person();
//outputs: I'm Stackoverflow
Person.call(person1);
//outputs: I'm Stackoverflow
Person.apply(person2);
//outputs: I'm Stackoverflow
Person.call(person3);
//outputs: I'm Stackoverflow
- Итак, как вы можете заметить в приведенном выше примере, любой объект, который вы передаете Person , всегда будет использовать объект person0 : он жестко привязан .
это в конструкторских функциях
 При использовании функции в качестве конструктора , он имеет специальный this связывание, которое относится к вновь созданному объекту: 
function Cat(name) {
  this.name = name;
  this.sound = "Meow";
}
var cat = new Cat("Tom"); // is a Cat object
cat.sound; // Returns "Meow"
var cat2 = Cat("Tom"); // is undefined -- function got executed in global context
window.name; // "Tom"
cat2.name; // error! cannot access property of undefined