В нижеприведенном фрагменте привязки
function foo(something) {
this.a = something;
}
var obj1 = {};
var bar = foo.bind( obj1 );
bar( 2 );
console.log( obj1.a ); // 2
var baz = new bar( 5 );
console.log( obj1.a ); // 2
console.log( baz.a ); // 5
На этом этапе var bar = foo.bind( obj1 );
мы связываем obj1
который пуст функции foo
.
После выполнения bar(2)
значение obj1
2.
Хотите узнать, какой bar(2)
был запущен?
Мое предположение:
Поскольку bar
назначается foo
и привязан к obj1
, вызывающая bar(2)
могла бы присвоить this.a = 2
и сохранить это значение в obj1
(ieobj1 = {a: 2}).
Правильно ли мое предположение?
Любая помощь приветствуется.
Чтобы понять это, вам нужно сначала взять то, что делает.bind?
bind - это функция, которая возвращает другую функцию, которая называется bound.
function x (){
console.log(this.item)
}
рассмотрите приведенный выше код, не имеет никакого представления о том, что такое item
.
var obj = { item : 10};
рассмотрите этот объект, этот объект знает об его свойстве item.
Когда вы вызываете.bind на объект x
(функция), он возвращает ту же копию функции (называемой bound), но с контекстом obj {item: 10}
.
var bound = x.bind(obj);
В этом конкретном заявлении указывается эта конкретная функция с контекстом obj.
Теперь, если мы назовем bound()
он напечатает 10
Здесь bind(obj1)
работает, как вы перекрывая по умолчанию scope
от foo
function
для obj1
, так this
ключевое слово заменяется пустой объект (obj1
) внутри foo
.
function foo(something) {
//this = {} (obj1);
//this.a == obj.a
this.a = something;
}
var obj1 = {};
var bar = foo.bind(obj1);
Вызов функции bind()
для функции возвращает новую связанную функцию. Когда вы вызываете эту связанную функцию, она будет выполнять исходную функцию с контекстом, который вы передали в качестве первого аргумента. Поэтому this
внутри foo
указывает на obj1
при вызове через связанную функцию.
Ваше предположение верно.
var bar = foo.bind( obj1 );
делает бар ссылкой на объект foo. Таким образом, теперь вы можете получить доступ к функции через бар.
bar( 12 );
печатает 12, если вы вызываете console.log()
и так далее.