2009-11-24 78 views
5

我試圖將 閉包內的一些現有頂層函數分組(以避免污染全局名稱空間),但我並不完全使用 來使其工作。首先,所有的JS在我的匿名函數之外工作,但是一旦我把 它放在匿名函數中,我會得到一個「交叉淡化不是 定義的錯誤」的錯誤。有沒有人看到任何完全明顯的東西,我 失蹤?Closure/scope JavaScript/jQuery

我不太越來越爲什麼在的setInterval /淡入淡出的作品外 匿名函數而不是內部。 start()中的任何內容應該能夠在start()之外看到變量/函數,並且它應該全部在頂層匿名函數創建的閉包中受保護 ? 我並不想交叉淡入淡出()內訪問任何,我只是 試圖執行它。

(function($) { 

    //vars up here that internal functions can access 
    //also using some jquery inside here, so using $ 

    function crossfade() { 
     //body here 
    } 

    //other functions 

    function start() { 
     //body here 

     cInterval = setInterval('crossfade()', 5000); 
    } 

})(jQuery); 

回答

7

setInterval方法會在窗口的範圍內運行,因此,淡入淡出功能不存在那裏。你必須做一個匿名函數,這樣一個封閉創建一個包含對函數的引用:

cInterval = window.setInterval(function() { crossfade(); }, 5000); 
+0

非常感謝這對我有用。 – 2009-11-24 19:30:42

8

使用setInterval('crossfade()', 5000);不創建一個封閉 - 它會創建一個字符串是eval() d。您應該使用的函數:

setInterval(function() { crossfade(); }, 5000); 
+6

我會使用setInterval(crossfade,5000); – Nosredna 2009-11-24 19:02:09

1

爲了避免污染在全球範圍內,你可以做幾件事情:

  • 擴展的jQuery ,因爲你已經在使用jQuery。 (使用jQuery作爲名稱空間。)
  • 創建一個單個對象來保存您的方法。 (創建您自己的命名空間。)
2

setInterval傳遞一個字符串時,該字符串在全局範圍內計算。這解釋了爲什麼crossfadesetInterval發生火災時不可見。

setInterval也可以通過一個函數引用:

在這種情況下
setInterval(crossfade, 5000); 

您的代碼將如預期,因爲crossfade是在您致電setInterval點可見。

+0

是的,我試過這個,但是我得到一個關於它沒有被引號調用的錯誤。 – 2009-11-24 19:29:50

+0

首選的方式是沒有引號。你準確地得到了什麼錯誤信息? – Nosredna 2009-11-24 19:35:31