这是 Javascript 经常被误解的一个方面。 (我所说的“这个”是指this
)
你可以想到this
作为另一个不可见地传递给函数的参数。所以当你写一个函数时,
function add (a,b) {
return a+b;
}
你真的在写
function add(this, a, b) {
return a+b;
}
这可能是显而易见的,不明显的是what被传入,并命名为“this”。其规则如下。调用函数有四种方法,每种方法都绑定不同的东西this
.
经典函数调用
add(a,b);
在经典的函数调用中,this
绑定到全局对象。该规则现在被普遍认为是一个错误,并且可能在未来的版本中被设置为空。
构造函数调用
new add(a,b);
在构造函数调用中,this
设置为一个全新的对象,其内部(且不可访问)原型指针设置为 add.prototype
方法调用
someobject.add(a,b);
在方法调用中,this
被设置为某个对象。无论您最初在何处定义 add,无论它是在构造函数内、特定对象原型的一部分还是其他什么,都没有关系。如果您以这种方式调用函数,this
设置为您调用它的任何对象。这就是你所违反的规则。
调用/应用调用
add.call(someobject,a,b);
在调用/应用调用中,this
设置为您传递给调用方法现在可见的第一个参数的任何内容。
你的代码中发生的事情是这样的:
this.parser.didStartCallback = this.parserDidStart;
当您编写 parserDidStart 时期望它this
当您方法调用它时,它将是一个 EpisodeController...实际发生的是您现在正在更改它this
从 EpisodeController 到 this.parser。这并没有发生在that特定的代码行。切换实际上不会发生,直到这里:
this.didStartCallback(this);
where this
在本例中是 EpisodeParser,并且在运行此代码时,您已将 parserDidStart 指定为 didStartCallback。当您使用此代码在此处调用 didStartCallback 时,您实际上是在说...
didStartCallback.call(这,这);
通过说 this.didStartCallback() ,你正在设置它this
到.. 好吧..this
当你调用它时。
您应该知道一个名为“bind”的函数,其解释如下:https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Function/bind https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Function/bind
Bind 从现有函数创建一个新函数,其this
固定(绑定)到您显式传入的任何对象。