function TheTable(calculateButtonId)
{
this.errorsBlock = document.getElementById("Some Value");
var addError = function(text) {
this.errorsBlock.innerText += text + "\n";
}
var customHandler = function(desc, page, line, chr) {
addError("[" + line + "] " + desc);
return true;
}
this.init = function() {
window.onerror = customHandler;
......................
}
this.init();
}
var table = new TheTable("BtnId");
我将this.addError
更改为var addError
后,它就开始抛出错误:
Cannot set property 'innerText' of undefined
你能否澄清一下,我在var-function中的this
引用了什么?
答案 0 :(得分:2)
一些事情:
每当使用new
关键字调用函数时 - 例如new TheTable("BtnId")
- 您创建该类型的新实例。该构造函数中this
的值引用了这个新实例。
您可以向此新实例添加任意属性。
通常,当您调用已分配给此新对象的函数时,函数内的this
值就是同一个实例。
var
关键字创建一个作用于其最近的封闭函数的变量。通常,当您调用此类型的函数(即创建为全局或局部变量的函数)时,其中this
的值为window
。
所以当你这样做时:
this.errorsBlock = document.getElementById("Some Value");
this.addError = function(text) {
this.errorsBlock.innerText += text + "\n";
}
this.addError("whatever");
...然后this
内的addError
的值指的是errorsBlock
分配给的同一个对象,并且调用成功。但是,当您将其更改为:
var addError = function(text) {
this.errorsBlock.innerText += text + "\n";
}
addError("whatever");
...然后this
内的addError
的值为window
,而window
可能没有任何名为errorsBlock
的函数属性和调用失败。
答案 1 :(得分:1)
function TheTable(calculateButtonId) {
this.errorsBlock = document.getElementById("Some Value");
var self = this;
var addError = function(text) {
self.errorsBlock.innerText += text + "\n";
}
}
这在javascript中始终是运行函数的上下文。