У меня есть этот простой код:Почему я теряю контекст этого в Javascript?
var o = {
a: 1,
b: 2,
f1: function()
{
alert(this.b);
}
}
var o2 = {
a: 11,
b: 22,
f2: function (j)
{
j();
}
}
Но работает этот код:
o2.f2(o.f1)
дающего неопределенной. (в то время как им ожидалось «22» в результате)
Теперь я знаю, что контекст куда-то ушел. и, следовательно, если изменить код в o2
на:
f2: function (j)
{
j.apply(this);
}
Это делает работу, очевидно.
Но мой вопрос:
- В какой стадии я потерять контекст?
Я не понимаю: когда j()
работает, там являетсяb
свойство в o2
объекта.
Что мне не хватает?
Когда вы называете это 'f()' - методы JavaScript - это * «несвязанные функции» * (то есть, в отличие от методов на других языках, они * не * связаны с конкретным объектом/экземпляром), и это вызов -site, который определяет 'this' при вызове. (Конечно, см. ['Function.bind'] (https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/Function/bind) или эквивалентные эмуляции.) – user2246674
Вы потеряете его как можно скорее когда вы проходите мимо 'o.f1'. Если вы выполняете 'var x = o.f1' и вызываете' x() ',' f1' больше не привязывается. – Blender
@Blender Я знаю это. но почему «это» не относится к «o2»? это то, что я не понимаю. –