Оператор try/catch
в ECMA- / Javascript создает новый Context . Технически это похоже на оператор eval
и, следовательно, eval Context
.
Текущая цепочка областей действия расширяется вновь созданным " eval Context ", и поэтому переменная Context * this
будет указывать на неправильную контекст, когда только что вызван this.onReadyState();
.
Вызвав net.ContentLoader.onReadyState.call(loader);
, автор явно вызывает метод onReadyState
с контекстом объекта loaded
(и это то, на что ссылается this
внутри вызываемого ). A callee - это функция (-context ...), вызываемая вызывающей стороной (-context).
Короче говоря, ECMAscripts
.call()
и .apply()
методы позволяют
вам установить конкретный контекст для
функция при вызове. Это
необходимо здесь, потому что try/catch
создает новый контекст и значение
this
в вызываемом методе
быть неправым.
Хотя приведенное выше утверждение верно, здесь оно не несет ответственности. Проблема не в контексте из try / catch
, а в контексте созданной анонимной функции
this.req.onreadystatechange=function(){
net.ContentLoader.onReadyState.call(loader);
}
Использование this
в этом анонимном методе «снова» будет ссылаться на другой контекст. Вот почему автор кэшировал значение из this
в loader
и вызывает метод с этим кэшированным контекстом.