Здравствуйте!
Function.prototype.myBind = function(oThis){
var aArgs = Array.prototype.slice.call(arguments, 1),
fToBind = this, // foo
fNOP = function(){},
fBound = function(){
console.log( this ) // window , тот ли это this, который используется в условии под ( ? )
return fToBind.apply(
(this instanceof fNOP && oThis ? this : oThis), // (?)
aArgs.concat(Array.prototype.slice.call(arguments))
);
}
;
fNOP.prototype = this.prototype;
fBound.prototype = new fNOP();
return fBound;
};
function foo(s){
this.a = s;
};
var o = {};
var bar = foo.myBind();
bar(1000);
console.log(a, window.hasOwnProperty('a')); // 1000, true
console.log(o.a); // undefined
Это пример из книги
Кайла Симпсона :
"Вы не знаете JS : замыкания & объекты" Немного переделанный полфил фукнции
bind(. .)
c сайта
MDN
Собственно интересует строка под комментарием
( ? )
! Хоть убей не пойму, при вызове функции
fToBind.apply( obj , arguments )
разумеется мы ожидаем что ей будет передан какой-то объект, т.е. объект контекста, но тогда зачем нужна проверка
this instanceof fNOP
Мы проверяем является ли
fNOP
( а по условию если я правельно понял это обычная функция) классом который создал объект
this
, причем зыс при вызове функции
fToBind.apply( obj , arguments )
указывает на
window
??? Но самое непонятное, как получается , что это работает . . . т.е. когда я вызываю
var bar = foo.myBind( );
,
this
указывает на
window
, т.к. я же не передаю в функцию
майбайнд
аргумент, и как получается что данная проверка
this instanceof fNOP && oThis
возвращает
true
, потому-как
this
в данном случае явно не является объектом, который был создан с помощью
fNOP
. Я чётко понимаю, что где-то я мыслю совсем не правильно, пример работает, НО мне не понятно! Поэтому прошу помощь в пояснении данного примера, точнее данной строки кода. . . И да, как получаются, что второе условие этой проверки,
this instanceof fNOP && oThis
проверяет передан ли объект
oThis
или нет в качестве аргумента в функцию
myBind( )
и разумеется если он не передан, в "пустом" вызове
var bar = foo.myBind( );
то условие уже должно вернуть
false
НО если оно вернёт
false
как мы можем использовать то, что не передано в
this instanceof fNOP && oThis ? this : oThis
В своих рассуждениях я провёл эксперимент насчёт того, на что же всё таки указывает
this
в функции которая возвращается из функции
myBind( )
и сделал похожий аналог :
function foo(){
return function(){
console.log(this.a);
};
};
let o = {a:'this is o.a'};
window.a='this is window.a';
let bar = foo.bind(o);
bar()() // "this is window.a"
Хм, получается что функция
fToBind.apply( . . .)
в теле функции
myBind( )
правда получает
window
если не передавать ничего, и
oThis
если этот объект передан. . . В общем просьба подсказать, где мои размышления пошли не так, просьба не кидать ссылки на
ljs
и т. д. с подтекстом -
" надо учить на что указывает зыс " Про
this
в целом прочитано не мало статей, НО перечитывать всё заного чтобы понять какой-то нюанс данного примера это расточительство, поэтому буду рад услышать объяснение данного примера , в чем моя ошибка?