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

  • вызов
  • применять
  • связывать

Важное примечание:
«call» и «apply» выполняют функцию. «bind» возвращает функцию.

вызов

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

var num = 1;
var obj = {num: 100};
var addTothis = function(a, b) {
    return this.num + a + b;
}
addTothis(100, 200); // 301
addTothis.call(obj, 100, 200); // 400

применять

Та же концепция, что и у «call()», но дополнительные аргументы передаются в виде списка.

var num = 1;
var obj = {num: 100};
var addTothis = function(a, b) {
    return this.num + a + b;
}
addTothis(100, 200); // 301
// call
addTothis.call(obj, 100, 200); // 400
// apply
var arr = [100, 200];
addTothis.apply(obj, arr); // 400 

связывать

«bind» просто возвращает функцию, которая использует предоставленный объект для «этого».

var num = 1;
var obj = {num: 100};
var addTothis = function(a, b) {
    return this.num + a + b;
}
addTothis(100, 200); // 301
// call
addTothis.call(obj, 100, 200); // 400
// apply
var arr = [100, 200];
addTothis.apply(obj, arr); // 400
// bind
var boundedAddTothis = addTothis.bind(obj);
boundedAddTothis(100, 200); // 100 + 100 + 200 = 400
// bind example with extra parameters
var boundedAddTothis2 = addTothis.bind(obj, 1, 2);
boundedAddTothis2(); // 100 + 1 + 2 = 103