это часто неправильно понимаемый аспект Javascript.(и под «этим» я подразумеваю this
)
Вы можете думать о this
как о другом параметре, который незаметно передается вашим функциям.Поэтому, когда вы пишете такую функцию, как
function add (a,b) {
return a+b;
}
, вы действительно пишете
function add(this, a, b) {
return a+b;
}
Это, вероятно, очевидно, а то, что не очевидно, точно , что передается и называется как "это".Правила для этого следующие.Существует четыре способа вызова функции, и каждый из них связывает свою вещь с this
.
классический вызов функции
add(a,b);
в классическом вызове функции this
привязан к глобальному объекту.Это правило теперь повсеместно воспринимается как ошибка, и в будущих версиях, вероятно, будет установлено значение null.
вызов конструктора
new add(a,b);
в вызове конструктора, this
устанавливается равнымсвежий новый объект, внутренний (и недоступный) указатель прототипа которого установлен на add.prototype
вызов метода
someobject.add(a,b);
в вызове метода, this
получает значение someobject.не имеет значения, где вы изначально определили add, находился ли он внутри конструктора, части прототипа конкретного объекта или чего-то еще.Если вы вызываете функцию таким образом, this
устанавливается для любого объекта, для которого вы ее вызывали.Это правило, с которым вы сталкиваетесь.
вызов / применение вызова
add.call(someobject,a,b);
в вызове / применении вызова, this
устанавливается равным тому, что вы передаете в видимый теперь.Первый параметр метода вызова.
, что происходит в вашем коде:
this.parser.didStartCallback = this.parserDidStart;
, пока вы пишете parserDidStart, ожидая, что его this
будет EpisodeController при вызове методаэто ... что на самом деле происходит, так это то, что вы теперь меняете this
с EpisodeController на this.parser.Это не происходит в этой конкретной строке кода.Переключение физически не происходит до тех пор, пока здесь:
this.didStartCallback(this);
, где this
в этом случае - EpisodeParser, и к тому времени, когда этот код выполняется, вы присвоили parserDidStart имя didStartCallback.Когда вы вызываете didStartCallback здесь, с этим кодом вы, по сути, говорите ...
didStartCallback.call (this, this);
, говоря this.didStartCallback (), выустановив для this
значение .. ну .. this
при его вызове.
Вы должны знать о функции, называемой bind, которая объясняется здесь: https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Function/bind
Bind создает новую функцию из существующей функции, чья this
фиксирована (привязана) к любому объекту, который вы явно передаете.