0

我有对象:

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");
        }
    ]
};

on window.load,我正在调用该init方法。这很好,但是当它调用另一个对象方法时assignHandlers,它会抛出一个错误:

[17:54:33.192] TypeError:obj.assignHandlers 不是函数

为什么?

4

1 回答 1

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);
于 2013-09-12T13:12:26.303 回答