2017-01-09 40 views
0

當涉及到對象變量時,我不理解JavaScript範圍。我有以下類定義:在類中訪問構造函數屬性

class DataHandler { 
    constructor(boardIDA, boardIDB, accessToken, eventA, eventB) { 
    this.times = []; 
    this.eventA = eventA; 
    this.eventB = eventB; 
    this.apiURLA = "https://api.particle.io/v1/devices/" + boardIDA + "/events/" + eventA + "/?access_token=" + 
     accessToken; 
    this.apiURLB = "https://api.particle.io/v1/devices/" + boardIDB + "/events/" + eventB + "/?access_token=" + accessToken; 
    this.eventListenerA = new EventSource(this.apiURLA); 
    this.eventListenerB = new EventSource(this.apiURLB); 
    this.addListener(this.eventListenerA, 
     eventA); 
    this.addListener(this.eventListenerB, eventB); 
    } 
    addListener(eventSrc, eventName) { 
    eventSrc.addEventListener(eventName, function(info) { 
     alert(eventName); 
     var parsedData = JSON.parse(info.data); 
     this.times.push(parsedData); 
    }); 
    } 
} 

問題是與this.times。我已經在構造函數中聲明瞭它。但是,我似乎無法在addListener中訪問它 - 我收到錯誤消息,說我正嘗試撥打pushundefined。我究竟做錯了什麼?

+0

,'this'通常是觸發事件 –

回答

2

您未在addListener中訪問它,您嘗試在匿名事件處理程序中訪問它,該處理程序使用不同的this進行調用。

addListener(eventSrc, eventName) { 
    var handler = function(info) { 
    alert(eventName); 
    var parsedData = JSON.parse(info.data); 
    this.times.push(parsedData); 
    }; 
    eventSrc.addEventListener(eventName, handler.bind(this)); 
} 
在事件監聽
+0

會改變匿名函數的對象(你現在已經改成處理程序,但原碼思維)的箭頭功能也行?因此否定綁定的需要 - 考慮到代碼已經使用了ES2015'class',那麼爲什麼不使用'=>'(如果它是替代) –

+0

@JaromandaX - 是 - https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Functions/Arrow_functions#No_binding_of_this – Igor

+0

「* ...在不同範圍中調用*」可能會更好,因爲調用函數的範圍不會影響函數的作用域它的* this *如何設置。 ;-) – RobG

相關問題