interface IMySocks {
start(): void;
}
declare var $;
class MySocks implements IMySocks {
private address: string;
private protocols = [];
private mySock: WebSocket;
start() {
this.mySock = new WebSocket(this.address, this.protocols);
this.mySock.onclose = this.onclose;
this.mySock.onopen = this.onopen;
this.mySock.onerror = this.onerror;
this.mySock.onmessage = this.onmessage;
}
private onopen(): void {
this.sendIt();
console.debug("OPEN");
}
private sendIt() {
.....}
var my:IMySocks = new MySocks(); my.start();
所以这样的课程在主题中出现错误。 Intellisense和编译在typescript文件中没有发现错误。我正在使用VS2012 Ultimate update 2和typescript 1.0。怎么了?
当我调用this.sendIt();
时会出现问题答案 0 :(得分:2)
与C#等其他编程语言不同,它会将this
上下文保留为您想要的内容,但JavaScript中的this
上下文略有不同。有关详细信息,请阅读this。
除了创建用于捕获this
的闭包,您还可以考虑使用ES5中提供的bind
更为典型的JavaScript方法(Mozilla docs / MSDN docs):
this.mySock.onclose = this.onclose.bind(this);
bind
返回绑定到提供的this
上下文(或您想要的任何上下文)的函数。该函数(onclose
)将在运行时使用适当的上下文集调用。
答案 1 :(得分:1)
问题在于this
在这种情况下并未指向MySocks
的实例,而是指向WebSocket
的实例。
如果您希望this
引用有效,可以执行以下操作
this.mySock.onopen = () => { this.onopen(); };
答案 2 :(得分:1)
如果您计划传递函数,则需要使用lambda。无论是丹尼斯推荐的还是:
private onopen = () => {
this.sendIt();
console.debug("OPEN");
}
由于这个原因,请参阅:https://www.youtube.com/watch?v=tvocUcbCupA&hd=1这是因为如果您只是在不使用lambda的情况下传递成员函数(并让其他人调用它),则调用上下文会丢失。