2017-10-19 104 views
0

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

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

回答

1

每个函数都有它自己的上下文,其内部指的是this。您传递给forEach的函数的上下文不涉及对象本身。所以你需要保持函数的上下文来引用当前对象。用arrow function更改函数声明以保留外部上下文。

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

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

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

关于*为什么*有所作为的解释会使这个更好的答案。 – Quentin

+0

谢谢你。我并不知道箭头功能的附加功能。我想知道为什么在原始代码中使用addTab(而不是this.addTab)也不起作用? –

+0

因为'addTab'与当前对象有界。所以你需要找到那个对象,而不是从它调用'addTab' –