2010-09-01 41 views
3

我正在專有網站上工作,並且遇到一些問題。我使用jQuery以及原型,並且我已經正確地使用了名稱空間,所以在這個問題中,假設您可以使用$或jQ作爲jQuery的名稱空間引用。在Javascript中定義函數在jQuery中

所以我有一堆功能,一些混合jQuery和JavaScript,一些純JavaScript,一些jQuery只。現在,目前某些功能的的document.ready jQuery函數中定義的,有些是它的外部定義,有點像這樣:

jQ(document.ready(function($) { 

    if (ifConfig) { 
    //page check, function calls here 
    fnc1(); 
    fnc2(); 
    fnc3(); 
    fnc4(); 
    } 

    function fnc1() { 
    //fnc code in here 
    } 
    function fnc2() { 
    //fnc code in here 
    } 
}); //end document.ready 

function fnc3() { 
} 
function fnc4() { 
} 

現在,這是所有的僞代碼,你可以承擔的功能是有效的,在他們有有效的代碼。最近我在做一些調試,並且在document.ready中聲明和調用的一個函數表示它是未定義的。我把它移到了document.ready之外,並且一切都重新開始。

我基本上試圖理解函數如何啓動/調用的順序更好,所以我的問題是什麼時候在document.ready中聲明函數,以及何時在外部聲明它們?你只在內部聲明它們是否只在該文檔中被調用?或者我應該總是隻在該文檔之外聲明它們?

謝謝。

回答

4

通常,您應該聲明&定義您自己的namespace,其中包含您的所有應用程序邏輯(包括函數/方法)。這樣,您可以避免collision與您網站上的其他腳本+這樣您的代碼更清潔,更易於維護。

var myapp = function(){ 
    var foobar1 = null, 
     foobar2 = null, 
     foobar3 = null; 

    return { 
     getFoobar1: function(){ 
      return foobar1; 
     }, 
     getFoobar2: function(){ 
      return foobar2; 
     }, 
     setFoobar1: function(foo){ 
      foobar1 = foo; 
     }, 
     clickhandler: function(e){ 
      alert('I am an event handler, and I am not anonymous'); 
     } 
     // etc. 
    }; 
}; 

$(document).ready(function(){ 
    var Application = myapp(); 

    Application.getFoobar2(); 

    $(document).bind('click', Application.clickhandler); 
}); 

這種模式(有人稱之爲「法模式」)創建了一個合攏函數/對象這也保證了您的命名空間內的私有成員變量,只有通過從外部getter函數訪問。

這真的只是一個非常基本的例子,你可以把這個想法&模式擴展,這是非常好的&好東西(IMO)。

一本關於這個被命名和推薦的經常出版的書的好書是Douglas Crockford的「Javascript:The Good Parts」。

+0

勾結?這是對的,還是你的意思是碰撞? – 2010-09-01 18:28:46

+0

@Daniel:是的,謝謝你的提示。 – jAndy 2010-09-01 18:38:49

+0

我非常喜歡這個,非常有趣。聲明/調用函數使用此方法會如何影響性能? – 2010-09-01 18:56:45

0

(document).ready更多地用於需要在頁面加載時執行的事情,而不是函數聲明。如果你在(document).ready中聲明它們,它們的作用域將在該塊的本地 - 如果它們只在本地使用,沒關係,應該在那裏聲明它們。否則,在外面宣佈它們。

因此,在您的示例中,如果函數僅用於該塊中,則應在其中聲明它們。如果他們另外使用其他地方,他們應該在外面宣佈。

+0

所以你只是說當你有很多本地函數在document.ready中使用時,在本地聲明。否則,只需全局聲明。 – 2010-09-01 18:06:30

+0

如果僅在本地使用,則在本地聲明。否則全局聲明。對不起,如果我不夠清楚。 – 2010-09-01 18:08:15

0

如果函數僅用於文檔就緒函數內部,則將其內部聲明,以免污染全局範圍。否則,在外部聲明它,以便腳本的其餘部分可以訪問這些功能。

+0

關於處理程序怎麼樣?當您將document.ready內的事件處理程序分配給document.ready中的某個函數時,是否需要在全局範圍內或僅在本地範圍內聲明該事件處理程序? – 2010-09-01 18:05:17

+0

@bryan taylor:在ready內部很好 - 因爲事件處理程序存儲在該元素的click處理程序列表中,所以當您退出該作用域時,引用不會丟失。 – 2010-09-01 18:22:37