2011-02-04 47 views
0

This反正是關係到this保持跟蹤同一功能的多個運行中,第2部分

我需要的其實是一些稍有不同,我需要這樣的一些方法:

function run(arg) { 
    this.ran = this.ran || false; 
    if (!this.ran) init; 
    /* code */ 
    this.ran = true; 
} 

該作品好,我只是想確保這個代碼工作,即使當this的情況下,它被稱爲call()或申請()

檢查this爲我所說的,所有的電話af第一個應該都是真的,不管上下文如何

+0

Doesnt my [answer這裏](http://stackoverflow.com/questions/4893656/how-can-i-keep-track-of-multiple-runs-of-the-same-function/4893989#4893989)在你的其他問題處理這個? – 2011-02-04 07:16:31

+0

刪除我的答案,因爲您的原始問題包含完全相同的解決方案。 – Anurag 2011-02-04 07:50:36

回答

1

得到充分利用封閉的,我建議你換你的主要功能是啓動了「跑」標誌的另一個功能:

function initRun(){ 
    var ran = ran || false; 
    return function(arguments){ 
     if(ran) 
      { 
       console.log("can't run any more!"); 
       return; 
      } 
     ran = true; 
     console.log("i'm running!"); 
     /* your logic here */ 
    } 
} 
var run = initRun(); 

,那麼你可以測試它通過調用你的函數中的任何你想要的方式:

run(); 
run.call(); 
run.apply(); 

它成功運行只有一次,不管使用的調用方法。
迷你的缺點是,你需要一個額外的功能,包裝你的初始「運行」功能,但我認爲它比使用全球標誌,跟蹤你的函數調用更可靠和優雅

0

你可以用「arguments.callee」替換「this」。 arguments.callee應該始終爲您提供表示當前函數的對象,從而使您不會更改「this」。 (但是我沒有測試^^)

0

當你定義一個獨立函數時,「this」是指全局窗口對象。如果是這種情況,那麼你可以明確地使用全局變量,以避免「。」從.apply()或.call()被篡奪的可能性。作爲一個方面說明,如果你定義一個函數作爲一個對象的屬性,「this」是指擁有的對象。請注意,「this」是對功能所有者的引用,所有者依賴於上下文。

編輯:另外,作爲@ Anurag的建議的後續,這是不適合的?

var run = (function createRun() { 
    var ran = false; 
    return function(arg) { 
     if (!ran) init; 
     // code 
     ran = true; 
    }; 
})(); 

run(arg);