let a = {
prop : 1,
f : function() {
console.log(this.prop);
}
},
b = {
prop : 2,
f : function() {
console.log(this.prop);
}
}
/*
Функция имеет контекст если:
-Функция вызывается из объекта через точку или квадратные скобки
-для вызова используется bind, call или apply
-функция вызывается с ключевым словом new
*/
// ----------------------------------------------------------------------------------------------------------
// bind | Когда необходимо передать куда-либо функцию с измененным контекстом, либо отложить выполнение |
// | функции с измененным контекстом |
//------------------------------------------------------------------------------------------------------------
// call | Когда нужно изменить контекст ф-ции с заранее известным кол-вом аргументов и сразу вызвать ее |
//------------------------------------------------------------------------------------------------------------
// apply | Когда нужно изменить контекст ф-ции с заранее НЕизвестным кол-вом аргументов и сразу вызвать ее |
//------------------------------------------------------------------------------------------------------------
//bind - берет функцию, меняет контекст и возвращает ее, но не вызывает
/*a.f();
b.f();*/
//При данной операции...теряется контекст функции (она становиться уже вне контекста объекта и
//возвращает undefined
let newFunc = a.f;
newFunc();
//При данном способе мы привязываем контекст объекта "B". Т.е. теперь this указывает на объект "B"
let newFunc = a.f.bind(b);
newFunc();
//Назначаем функции а в контексте b. Т.е. мы запускаем функцию из а, но в контексте объекта b
a.f = a.f.bind(b);
a.f();
b.f();
//Изменить контекст можно только один раз
let newFunc = a.f.bind(b);
newFunc = newFunc.bind(a);
newFunc();
//call - меняет контекст функции и вызывает ее
function summ(a, b) {
return this.prop + a + b;
}
let a = {
prop : 1,
f : summ
},
b = {
prop : 2,
f : summ
};
a.f(1,1);
b.f(2,2);
a.f = a.f.bind(b, 1, 1);
b.f = b.f.bind(a, 2, 2);
a.f();
b.f();
//Пример с bind
for (let i = 0; i < 10; i++) {
setTimeout((function(num){
console.log(num);
}).bind(this, i), 1000 * i);
}
// А теперь мы можем сделать проще. Просто указать в каком контексте будет работать фукнция
console.log(summ.call(a, 1, 1));
console.log(summ.call(b, 2, 2));
//Apply - тоже самое что и call, только аргументы можно передавать в виде массива
console.log(summ.apply(a, [1, 1]));
console.log(summ.apply(b, [2, 2]));
let a = {
prop : 1,
f : function() {
let func = function() {
console.log(this.prop);
};
// func();
func.call(this);
}
},
b = {
prop : 2,
f : summ
};
a.f();
let a = {
prop : 1,
f : function() {
let that = this;
let func = function() {
console.log(that.prop);
};
// func();
func();
}
},
b = {
prop : 2,
f : summ
};