2012-07-10 18 views
0

我創建了一個JavaScript類的全局變量,我想打電話給內每秒的方法,這裏是我的代碼:獲得類

var MyClass = Base.extend({ 
    myMethod: function() { 
     setTimeout(function(){ 
      var mc = new MyClass(); 
      mc.myMethod(); 
     }, 1000); 
    } 
}); 
var myGlobalClass = new MyClass(); 

myGlobalClass.myMethod(); 

其實這個代碼工作,但我需要做new MyClass()每次。
我希望使用myGlobalClass

這可能嗎?

只要精度this.myMethod()不能在這種情況下工作,如果你想到這一點。

感謝您的幫助

回答

3

如果你想reffer的值myGlobalClass那麼你可以只從功能

setTimeout(function(){ 
    myGlobalClass.myMethod(); 
}, 1000); 

這工作,因爲JavaScript不只是尋找定義的當地人這樣做直接在解析名稱的當前範圍內。它會查看所有父級範圍並解決它們。在這種情況下myGlobalClass在全局範圍內定義。名稱解析從setTimeout函數回調開始,並且它不會在函數中找到它,然後它將搜索myMethod: function() {,並且不會在那裏找到它,它會查找全局範圍並發現myGlobalClass。它會將名稱解析爲此值

+0

我第一次聽說過一個匿名函數在JavaScript中稱爲拉姆達。有趣的想法。 – jbabey 2012-07-10 15:01:23

+0

噢,我做了那個ID沒有工作我認爲我需要做別的事情,我再次嘗試,這次它工作...我有點慚愧,因爲它是邏輯。感謝您的回覆(我會在10分鐘內接受它) – Shadowbob 2012-07-10 15:02:15

+0

@jbabey我改變了我的答案,以消除對lambda的引用,以避免與即將到來的ECMA版本 – JaredPar 2012-07-10 15:04:33

0

如果您有多個實例,請給函數一個名稱並遞歸調用它。

myMethod: function myMethod() { 
    setTimeout(function(){ 
     myMethod(); 
    }, 1000); 
} 

這是在IE8-上的越野車。

+0

的提議的lambda功能混淆在我看來,與多個實例一起是一個壞一般的想法。修復很簡單,所以你只需要一個實例。 – Jon 2012-07-10 15:02:20

+0

@Jon:但爲什麼他會使用'new'和所有?如果只有一個實例,我只需要一個簡單的對象。 – pimvdb 2012-07-10 15:02:47

+0

他必須創建至少一個實例來引用該方法。但一旦他有了參考,就沒有必要再做一個新的。事實上,他根本不需要一個參考,就像@ JaredPar的答案所示。 – Jon 2012-07-10 15:04:09

1

如果你想每秒重複一次動作,你有沒有想過使用setInterval而不是setTimeout?然後myMethod將不必在每次通話中產生超時。

你可能只是這樣做:

var MyClass = Base.extend({ 
    myMethod: function() { 
     // do stuff here 
    } 
}); 

var myGlobalClass = new MyClass(); 

setInterval(myGlobalClass.myMethod, 1000); 
+0

好吧我從來沒有尋找差異,在這裏我不需要絕對的精度,但感謝你讓我搜索至少我知道在哪裏我的舊時間錯誤來自我做這種事情時;-) – Shadowbob 2012-07-10 15:09:39

2

而不是使用setTimeout到遞歸調用的方法。你可以使用setInterval,這可以讓你的代碼更加清晰。

var MyClass = Base.extend({ 
     myMethod: function() { 
      //.. 
     } 
    }); 
    var myGlobalClass = new MyClass(); 
    setInterval(myGlobalClass.myMethod, 1000);