所以我有这个Javascript函数(类):
function Test() {
this.a = function() { return 'hello'; }
this.b = function() { alert(this.a()); }
window.onload = this.b;
}
test = new Test();
代码不起作用,因为窗口加载的this.b函数变成了一个全局函数(在Test函数/类之外),其中this.a不存在。
这样的事情:
function Test() {
this.a = function() { return 'hello'; }
this.b = function() { alert(test.a()); } // changed this to test
window.onload = this.b;
}
test = new Test();
确实有效,但它假设我知道哪个变量包含Test函数/类,这会失去创建多个类的功能。
维护这种方法的最佳解决方案是什么(在函数/类中使用这个指针)并得到想要的结果?
答案 0 :(得分:5)
实际上,它与范围无关,与上下文无关。
请参阅,当调用事件处理程序时,this
设置为事件绑定的任何元素。在这种情况下,this
为window
。
尝试这样的事情:
function Test() {
var self = this;
self.a = function() {return 'hello';};
self.b = function() {alert(self.a());};
window.onload = self.b;
}
通过将上下文“保存”到变量self
,可以避免上下文问题。
答案 1 :(得分:3)
this
指的是本地函数function() { alert(this.a()); }
,如果你想引用“类范围”,你必须在该类中存储一个refence:
function Test() {
var localTest = this;
this.a = function() { return 'hello'; }
this.b = function() { alert(localTest.a()); }
window.onload = this.b;
}
test = new Test();
答案 2 :(得分:3)
尝试
window.onload = this.b.bind(this)
当您在javascript中编写someObj.func
时,结果参考不知道someObj
。因此,如果您需要this
中的正确func
,则必须明确提供。
这可以通过关闭this
的父作用域中的func
来完成,正如其他答案所示,但我认为bind
更透明。