调用对象中的另一个函数

时间:2013-12-19 01:24:13

标签: javascript oop

在查看了有关此主题的几个不同问题之后,我仍然难以理解如何从对象中访问另一个函数。

window.Think = {
    initialize: function(){
        this.currentNumber = 0;
    },
    updateNumber: function(){
        this.currentNumber += 1;
    },
    listener: function(){
        document.getElementById('foo').addEventListener('click', function(){
        this.parent.updateNumber(); //this is where I want to call the prev function
    }
}

我得到的错误是Cannot call method 'updateNumber' of undefined

如何在Think.updateNumber()内致电listener()

3 个答案:

答案 0 :(得分:5)

回调函数经常会丢失上下文(上下文是this的值)。所以你必须保存this的值。到与回调函数共享的局部变量。一个常见的约定是var self = this

listener: function(){
    var self = this;
    document.getElementById('foo').addEventListener('click', function(){
        self.updateNumber();
    }
}

答案 1 :(得分:3)

this将反弹到function的范围。解决方案是创建另一个变量,您可以将this引用到:

listener: function(){
    var that = this;
    document.getElementById('foo').addEventListener('click', function(){
        that.updateNumber();
    });
}

根据您定位的浏览器bind可能也是一种解决方案:

listener: function(){
    document.getElementById('foo').addEventListener('click', function(){
        this.updateNumber();
    }.bind(this));
}

答案 2 :(得分:2)

问题在于关键字“this”代表什么。

listener: function(){//We call this is function one.
        document.getElementById('foo').addEventListener('click', function(){//function two
        this.parent.updateNumber(); //this is where I want to call the prev function
    }

在函数一中,“this”表示对象Think.In函数二,“this”表示元素foo。所以,如果你想调用方法updateNumber,你应该得到对象Think.We的引用将函数one的“this”保存在变量中,如下所示:

listener: function(){//We call this is function one.
        var outerThis=this;//save Think here.
        document.getElementById('foo').addEventListener('click', function(){//function two
        outerThis.updateNumber();//use Think.updateNumber here.
    }

现在我们完成了工作。因为在javascript中,函数可以访问它的外部函数的变量,所以我们可以在函数二中使用outerThis。