Javascript成员函数超出范围

时间:2009-08-25 17:45:22

标签: javascript oop scope

我有一个创建锚对象的类。当用户点击锚时,我希望它从父类运行一个函数。

function n()
{
    var make = function()
    {
        ...

        var a = document.createElement('a');    
        a.innerHTML = 'Add';
        //this next line does not work, it returns the error: 
        //"this.add_button is not a function"
        a.onclick = function() { this.add_button(); }                                               

        ...
    }

    var add_button = function()
    {
        ...
    }

}

我怎样才能完成这项工作?

3 个答案:

答案 0 :(得分:5)

看起来你只需要摆脱“这个”。在add_button()

之前

您将add_button声明为局部变量(或以javascript类工作的奇怪方式私有),因此它实际上不是“this”的成员。

只需使用:

a.onclick = function(){add_button();}

答案 1 :(得分:1)

它不起作用的原因是this函数的上下文中的onclickthis函数/“类的上下文中的n不同”。如果您希望函数中的this与该类中的this等效,则需要绑定 this到该函数。

绑定是一种改变函数范围的方法 - 实际上,如果绑定到函数,则要替换this变量以指向其他内容。您可以在this alternateidea article中阅读有关Javascript绑定的更多信息。

例如,如果您使用prototype,则可以执行以下操作:

function n()
{
    var make = function()
    {
        ...
        a.onclick = function() { this.add_button() }.bind(this);
        ...
    }
}

将类n的{​​{1}}绑定到onclick函数,从而提供您想要的效果。

答案 2 :(得分:0)

“this.add_button();”中的“this”实际上是指锚元素本身没有“add_button()”函数,如果我没有弄错的话。

也许这会奏效:

a.onclick = function() { n.add_button(); }