Muranx
@Muranx
кто понял this тот в цирке не смеётся

Нужна помощь с полифилом bind(.. .)?

Здравствуйте!

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 в целом прочитано не мало статей, НО перечитывать всё заного чтобы понять какой-то нюанс данного примера это расточительство, поэтому буду рад услышать объяснение данного примера , в чем моя ошибка?
  • Вопрос задан
  • 108 просмотров
Пригласить эксперта
Ответы на вопрос 1
@historydev Куратор тега JavaScript
Острая аллергия на анимешников
this instanceof fNOP && oThis ? this : oThis // Если this равен типом данных результату функции fNOP и oThis существует то возвращаем this иначе oThis
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы