Понимание bind() в JavaScript
Согласно MDN: метод связывания
призвание
f.bind(someObject)
создает новую функцию с тем же телом и областью действия, что иf
, но там, где это происходит в исходной функции, в новой функции она постоянно связана с первым аргументомbind
независимо от того, как используется функция:
function f() {
return this.a;
}
var g = f.bind({a: 'azerty'});
console.log(g()); // azerty
var h = g.bind({a: 'yoo'}); // bind only works once!
console.log(h()); // azerty
var o = {a: 37, f: f, g: g, h: h};
console.log(o.a, o.f(), o.g(), o.h()); // 37, 37, azerty, azerty
Но когда я пытаюсь код ниже:
var module = {
x: 42,
getX: function() {
return this.x;
}
}
var unboundGetX = module.getX;
console.log(unboundGetX()); // The function gets invoked at the global scope
// expected output: undefined
var boundGetX = unboundGetX.bind(module);
console.log(boundGetX()); // expected output: 42
module.x = 43;
boundGetY = boundGetX.bind(module);
console.log(boundGetY()); // shouldn't this be 42??
Ожидаемый результат:
undefined
42
42
Фактический вывод:
undefined
42
43
Может кто-нибудь, пожалуйста, объясните мне это?
3 ответа
Здесь модуль является константой, а module.x - нет. По этой причине вы можете изменить значение module.x, но вы не можете изменить модуль.
поэтому вы меняете значение модуля, а не самого модуля.
Когда вы изменяете значение того же объекта, тогда вы не привязываете другой объект, поэтому значение изменяется.
var module = {
x: 42,
getX: function() {
return this.x;
}
}
var unboundGetX = module.getX;
console.log(unboundGetX()); // The function gets invoked at the global scope
// expected output: undefined
var boundGetX = unboundGetX.bind(module);
console.log(boundGetX()); // expected output: 42
var module2 = {
x: 43,
getX: function() {
return this.x;
}
}
boundGetY = boundGetX.bind(module);
console.log(boundGetY());
Я не слежу за тем, что вас смущает - похоже, все работает так, как описано.
- unboundGetX - это ссылка на вашу функцию.
- Вы меняете значение
module.x
до 43 - Вы создаете новый метод
boundGetY
позвонив по телефонуunboundGetX.bind(module)
то естьthis
что boundGetY относится кmodule
, - Ты звонишь
boundGetY()
- это относится кthis.x
которая является значениемmodule.x
, 43.