2013-01-23 175 views
7

我只希望我的JavaScript運行一次,但是我無法控制JavaScript文件執行的次數。基本上我正在寫一個小的JS代碼片段到CMS中,而CMS實際上調用了它5-10次。因此,解決方案是這樣的:Javascript正在運行代碼

function never_called_again(args) { 
    // do some stuff 
    never_called_again = function (new_args) { 
    // do nothing 
    } 
} 
never_called_again(); 

好像不工作,因爲只要我的片斷是從頂部的功能被重新聲明再次運行,並且「做一些東西」是重新評估。也許我只是沒有做好,我對JS不太瞭解。我使用的是類似的try-catch在一個全局變量考慮,像

if (code_happened == undefined) { 
    \\ run code 
    code_happened = true; 
} 

編輯:有例如一致的狀態如果我設置了一個變量,我可以看到當我的代碼片段再次運行。但不得不宣佈它之前,我訪問它,我不知道怎麼說「沒有這個變量仍然存在」

+1

「我不知道怎麼說‘沒有這個變量存在了嗎?’」 - 一般這是通過'var foo = window.foo ||完成的{}' – zzzzBov

回答

17

試試這個:

var doneTheStuff; 
function whatever() { 
    if (!doneTheStuff) { 
    doneTheStuff = true; 
    // do the stuff 
    } 
} 

冗餘變量聲明不會影響變量的值。一旦其中一個功能已經設置了變量true,其他什麼都不會做。

+0

作品!後續問題 - 它似乎運行最後聲明的功能,例如做'東西'做'alert(1)'和'alert(2)',你只會看到2.對我來說無所謂(它們都是一樣的),但無論如何迷人 – Hamy

+0

@Hamy - 我的解決方案會反向工作。只有第一個聲明的函數會運行。 –

+0

@Hamy如果代碼生成到相同的''

2

使用封閉,並設置一個標誌。如果標誌是true,只是返回:

if (! window.never_called_again ) { 
    window.never_called_again = (function() { 
     var ran = false; 
     return function (args) { 
      if (ran) return; 
      ran = true; 
      // Do stuff 
     }; 
    }()); 
} 

這裏的小提琴:http://jsfiddle.net/U2NCs/

+1

但如果在JavaScript中的兩個獨立位出現時,它就會有同樣的問題。 – Pointy

+2

整個文件被執行多次,包括定義功能,如果我理解OP的描述。這是一個更真實的表示,它確實被多次調用:http://jsfiddle.net/Qn52E/。 – mellamokb

+0

正如其他人指出的那樣,我更類似於mellamokb的評論,所以這似乎並沒有工作;-) – Hamy

3
if (typeof code_happened === 'undefined') { 
    window.code_happened = true; 
    // Your code here. 
} 

typeof檢查讓你身邊,全球尚未聲明的事實。你也可以只做if (!window.code_happened),因爲未定義的屬性不會禁止訪問屬性。