2017-05-31 53 views
0

我是新來的JS,所以我有這個關於正確的方式來綁定引用的新手問題。例如,我在打字稿這行代碼:TypeError:不是函數。正確的方式來綁定這個。參考JS

this.socket.on('new_task').subscribe(this.newTask); 
... 
    newTask(data) { 
    this.logEvent('new_task', data); 
    this.audio.playNewJob(); 
    } 
    logEvent(event: string, data) { 
    console.log(this.TAG + event + ' triggered with received data: ' + JSON.stringify(data)); 
    } 

如果我會嘗試運行此,我將獲得:

TypeError: this.logEvent is not a function 

如果我將變更爲:

this.socket.on('new_task').subscribe((data) => this.newTask(data)); 

一切都會正常工作,但它看起來像使用JS和TS功能的糟糕方式。這種情況下推薦的做法是什麼?我很感激這方面的一些鏈接。提前致謝。

+1

的可能的複製[如何做的JavaScript關閉工作?](https://stackoverflow.com/questions/111102/how-do-javascript-closures-work) – Hampus

+0

當你通過'this.newTask'作爲回調引用,函數和'this'之間的關聯失去了;實際上從來沒有這樣的聯繫。 – Pointy

+0

您是否嘗試過使用箭頭功能? '(data => this.newTask(data))' – Arg0n

回答

2

將其更改爲

.subscribe(this.newTask.bind(this)) 
+0

(我真的在ES6中考慮) – UXDart

2

問題是如何「這個」必然,它在執行時這樣做時,LOGEVENT函數被調用,這指的是全局對象不具有該功能。你的第二個例子很好,在這種情況下,當箭頭函數被定義時,這是被綁定的,另一種方法是存儲引用並從中調用函數,但是我個人更喜歡箭頭函數方法。注意並不是所有人都同意這一點,但我習慣於使用c#中的箭頭函數,並且我認爲如果您瞭解它們之間的區別,他們會更容易閱讀,並且可以通過更簡單的方式推理。

0

我面對這個問題與財產,而不是method。即我們可以聲明那種相同的功能與「屬性的語法」 ..其中property是一個函數(newTask下面是方法,newTaskAsProperty是更多的財產,ISH)

class MyClass { 
    newTask(data) { 
     this.logEvent('new_task', data); 
     this.audio.playNewJob(); 
    }  
    newTaskAsProperty = (data) =>{ 
     this.logEvent('new_task', data); 
     this.audio.playNewJob(); 
    } 
    ... 

有趣的是,是什麼將是transpiled結果:

var MyClass = (function() { 
    function MyClass() { 
     var _this = this; 
     this.newTaskAsProperty = function (data) { 
      _this.logEvent('new_task', data); 
      _this.audio.playNewJob(); 
     }; 
    } 
    MyClass.prototype.newTask = function (data) { 
     this.logEvent('new_task', data); 
     this.audio.playNewJob(); 
    }; 

因此,物業的做法(newTaskAsProperty = (data) =>{})在構造函數中被應用,該實例,而不是原型。這就是爲什麼使用是預期

// not working 
// this.socket.on('new_task').subscribe(this.newTask); 

// working 
this.socket.on('new_task').subscribe(this.newTaskAsProperty); 

唯一的缺點是代表將工作 - 這是不是方法,即不能被覆寫。

作爲一種變通方法,我們可以簡單地做電一個真正的方法,這裏面 - 如果需要的話,並且該方法將有this正確設置,可能會被覆蓋......

相關問題