Раннее и позднее связывание относится к тому, как и когда определяется контекст вызова “this” в функции.
Раннее связывание происходит во время компиляции, когда JavaScript создает скрытый объект, который будет использоваться в качестве контекста вызова “this” в функции.
Пример раннего связывания:
function myFunction() {
console.log(this)
}
myFunction() // контекст вызова "this" будет глобальным объектом WindowПозднее связывание происходит во время выполнения, когда функция вызывается, и контекст вызова “this” определяется на основе того, где и как она вызывается.
Пример позднего связывания:
const myObject = {
myMethod() {
console.log(this)
},
}
const myFunction = myObject.myMethod
myFunction() // контекст вызова "this" будет глобальным объектом WindowВ этом примере, контекст вызова “this” будет глобальным объектом Window при использовании раннего связывания, тогда как при использовании позднего связывания, контекст вызова “this” будет объектом “myObject”.
Ещё один пример:
Обычный метод bind называется «ранним связыванием», поскольку фиксирует привязку сразу же. Как только значения привязаны — они уже не могут быть изменены. В том числе, если метод объекта, который привязали, кто-то переопределит — «привязанная» функция этого не заметит.
*Позднее связывание — более гибкое, оно позволяет переопределить привязанный метод когда угодно. call вызывает функцию с заданным контекстом, а bind, по своей сути есть обертка, привязывающая контекст, которую можно передать в функцию.*
call - позднее связывание, bind - раннее связывание.