2016-08-17 16 views
0

我有一個包含多個方法和屬性的類。其中的一個方法,嵌入了作爲這樣的的setTimeout()函數:引用正確的'this'而無需重新聲明'this'內嵌功能

function myClass() { 
    this.some_property = "test"; 
    this.PrintOnTimeout = function() { 
     // I can do var.self = this; 
     // but I can't help but feel like that would be inefficient 
     setTimeout(function timeoutPrint() { 
      // I want to reference this.some_property here. 
      // Currently this.some_property returns an error as 
      // this refers to PrintOnTimeout() rather than myClass(). 
     }); 
    } 
} 

道歉提前如果在計算器上有一個答案了。我環顧四周,但幾乎找到了關於擴展類和super()的所有討論。也許超級()是這裏的答案,我不理解它?我會使用全局,但我更願意將這個類的每個實例視爲可能未識別的。所以如果有一個this.GetMainParent或其他東西...否則,我很欣賞這個優點。

編輯1:目標不是傳遞'this',這是顯而易見的,而是從一組嵌套內的任何位置引用主塊(或任何特定塊,如果設置爲這樣)功能。

編輯2:箭頭功能是我需要,如圖ASDFGerte該溶液中。

+0

*如果在StackOverflow上有答案,請事先道歉。*有。其實很多。 :-) – 2016-08-17 05:55:51

+0

我不確定你評論的目標是什麼。我之後立即解釋說我不確定如何查看它,所有我能找到的東西都是關於類擴展和super()的。事實上,這個問題被標記爲另一個問題的重複,當這個問題被標記爲是相同的,並沒有相同的解決方案。我不是想通過'this',我試圖從函數內部的任何地方(或嵌套函數(或嵌套函數))引用主塊。箭頭功能就是這裏的解決方案。 – Daniel

+1

[箭功能(https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Functions/Arrow_functions)在JS,提前的_could_如何做這個論點,都是一模一樣的創建這個目的。多次有效地聲明相同的值是很浪費的。箭頭函數FTW。 – Daniel

回答

0

您可以使用arrow function來綁定這個,使用bind(this)或關閉通過存儲屬性的本地變量。

需要注意的是,除非你綁定這對每一個參與的功能,你需要確保所有相關的功能總是被稱爲在正確的範圍內,否則你要綁定的嵌套函數的錯誤是:

function a(){ 
 
    this.x = "hi"; 
 
    this.y = function() { 
 
    setTimeout(() => { console.log(this.x); }, 100); 
 
    }; 
 
} 
 

 
let obj = new a(); 
 
let outside = obj.y; 
 
obj.y(); //y is being called with this === obj 
 
outside(); //y is being called with this depending on strict mode, window or undefined.

+0

完美。非常感謝你。 – Daniel

+0

它發生在我身上,我沒有具體說明解決方案是什麼。箭頭功能是我需要的。 – Daniel

相關問題