我有对象:
var devark = {
init: function() {
var obj = this;
obj.assignHandlers();
},
assignHandlers: function() {
var obj = this;
document.getElementById("menu-toggler").onclick = obj.documentFunctions[0];
},
documentFunctions: [
function() {
toggleClass(this, "opened");
}
]
};
在window.load
上,我正在调用init
方法。这工作正常,但当它调用另一个对象方法assignHandlers
时,它会抛出一个错误:
[17:54:33.192] TypeError:obj.assignHandlers不是函数
为什么?
答案 0 :(得分:2)
就像@Bergi所说,这是一个this
值问题,可以通过以下方式解决:
window.onload = function () {
devark.init();
};
两种方式之间的差异是this
函数中init
的值。要确定this
的自然值,请查看方法调用中.
的左侧,例如obj.someFn();
。此处this
中someFn
的值为obj
。但是,当您执行window.onload = devark.init;
时,您可以想象稍后将像window.onload()
一样调用处理程序。这意味着this
函数中onload
的值,init
函数实际上是window
,而不是devark
。
您还可以使用Function.prototype.bind
将特定this
值绑定到函数。
window.onload = devark.init.bind(devark);