bind
кэширует текущее значение своего
this
в момент своего вызова, т.е. он привязывает именно функцию, а не объект, в котором находится функция. Иначе нельзя было бы вызывать bind на просто функции по типу
foo.bind(abc)
. В мануале, кстати, описано что именно она кэширует - там полный список есть:
https://developer.mozilla.org/ru/docs/Web/JavaScri...
Упрощенный пример реализации
bind
для понимания механизма:
function binder(that) {
let targetFunction = this; // кэш целевой функции
return function() { targetFunction.call(that) } // В возвращаемой функции используем кэш
}
let user = {
name: "Tom",
intro() {
console.log("I am " + this.name);
}
}
user.intro.binder = binder
let f = user.intro.binder(user);
setTimeout(f, 1000);
user.name = "Sid";
user.intro = function() {
console.log("Вообще другая функция. name: " + this.name);
}