Новая привязка в JavaScript?

1

В нижеприведенном фрагменте привязки

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}).

Правильно ли мое предположение?

Любая помощь приветствуется.

Теги:
binding

4 ответа

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

2

Здесь 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);
2

Вызов функции bind() для функции возвращает новую связанную функцию. Когда вы вызываете эту связанную функцию, она будет выполнять исходную функцию с контекстом, который вы передали в качестве первого аргумента. Поэтому this внутри foo указывает на obj1 при вызове через связанную функцию.

0

Ваше предположение верно.

 var bar = foo.bind( obj1 );

делает бар ссылкой на объект foo. Таким образом, теперь вы можете получить доступ к функции через бар.

 bar( 12 );

печатает 12, если вы вызываете console.log() и так далее.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню