2017-10-19 105 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' –