Раннее и позднее связывание относится к тому, как и когда определяется контекст вызова “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 - раннее связывание.