JS - 被调用的方法不是一个函数

时间:2013-09-12 13:00:41

标签: javascript oop

我有对象:

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不是函数

为什么?

1 个答案:

答案 0 :(得分:2)

就像@Bergi所说,这是一个this值问题,可以通过以下方式解决:

window.onload = function () {
    devark.init();
};

两种方式之间的差异是this函数中init的值。要确定this的自然值,请查看方法调用中.的左侧,例如obj.someFn();。此处thissomeFn的值为obj。但是,当您执行window.onload = devark.init;时,您可以想象稍后将像window.onload()一样调用处理程序。这意味着this函数中onload的值,init函数实际上是window,而不是devark

您还可以使用Function.prototype.bind将特定this值绑定到函数。

window.onload = devark.init.bind(devark);