Javascript 在对象内部调用内部函数

Javascript 在对象内部调用内部函数,javascript,function,object,Javascript,Function,Object,希望这是一个简单的答案。我试图从对象内部调用一个方法,但是,控制台抛出了一个错误,该函数不是函数 function tabs(el, data){ this.el = el; this.addTab = function(data){ console.log("addTab", this.el, data); }; data.forEach(function(data){ this.addTab(data); }); }

希望这是一个简单的答案。我试图从对象内部调用一个方法,但是,控制台抛出了一个错误,该函数不是函数

function tabs(el, data){
    this.el = el;

    this.addTab = function(data){
        console.log("addTab", this.el, data);
    };

    data.forEach(function(data){
        this.addTab(data);
    });
}
我最初是这样调用我的对象的:

var t = new tabs("tabs", []);

我的错误是addTab不是一个函数。

每个函数都有它自己的上下文,其中的上下文引用了它。传递给forEach的函数的上下文不引用对象本身。因此,您需要保留函数的上下文以引用当前对象。使用更改函数声明以保留外部上下文

function tabs(el, data){
    this.el = el;

    this.addTab = function(data){
        console.log("addTab", this.el, data);
    };

    data.forEach(function(data){
        this.addTab(data);
    });
}
function tabs(el, data){
    this.el = el;

    this.addTab = function(data){
        console.log("addTab", this.el, data);
    };

    data.forEach((data) => {
        this.addTab(data);
    });
}

解释一下为什么会有不同,这将是一个更好的答案。谢谢。我不知道箭头函数的其他特性。我想知道为什么在原始代码中使用addTab而不是this.addTab也不起作用?因为addTab是绑定到当前对象的。因此,您需要找到该对象,而不是从itI调用addTab。我在最初的tabs函数中设置了一个var self=this,然后调用self.addTab而不是this.addTab或arrow函数,看起来正在工作。是的,神奇的:D在this关键字下,因为它是serviced关键字。用另一个名字你可以强迫工作