Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- 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
- };
Add Comment
Please, Sign In to add comment