2013-10-09 45 views
0

我對JavaScript還是比較新的,並且一直試圖圍繞特定的庫如何管理這種乾淨的類型和命名約定。關於Javascript層次結構行爲的困惑(給出了示例代碼)

有問題的圖書館是Telerik的劍道UI,具體我也很好奇他們是如何實現的東西,讓我想起了C#的命名空間。比如...有一個叫做ObservableArray類型,它可以通過kendo.ui.ObservableArray訪問。

我挖掘了源代碼,並且對發生的事情感到困惑。由於所有權方面的原因,我省略了很多代碼,但一般情況下不應該是一個問題。我想知道,如果有人可以幫助我掌握它們是如何實現一些這...

(function ($, evil, undefined) { 
    var kendo = window.kendo = window.kendo || { cultures: {} }, 
     extend = $.extend, 
     each = $.each; // more code omitted 

    function Class() { } 

    Class.extend = function (proto) { 
     // most of this code omitted 
     return subclass; 
    }; 
    // more code omitted 
})(jQuery, eval); // this line is really confusing me 

特別是,什麼我失去了令人難以置信的是,第二條線。它們在哪裏聲明變量(kendo)等於在窗口上定義的變量。我已經搜索了幾個小時和幾小時的高和低,並且不能在我的生活中找出這是第一次發生的地方。我一直無法在自己的代碼中重現相同的行爲。

我已經發現擴展函數可用作將對象與現有對象配對並將其選擇性附加爲可訪問成員的方式。不過那東西,這讓我發瘋。

+3

這只是一個別名,創建了一個指向'window.kendo'的局部變量。 –

回答

2

這並不複雜。藉此,例如:

var a, b, c; 
a = b = c = 100; 

括號可能會幫助:

a = (b = (c = 100)); 

c = 100實際上是一個表達式。它將100分配給c,然後評估爲100。這樣發展到:

a = (b = 100); 

然後將其分配給100b進一步簡化:

a = 100 

它終於也分配到100a


所以,當你具備以下條件:

var kendo = window.kendo = window.kendo || { cultures: {} } 

首先它分配的window.kendo || {cultures: {} }window.kendo結果。然後它將相同的結果分配給本地變量kendo


最後的訣竅是window.kendo || {cultures: {} }的確如此。a || b評估爲a如果a是真實的,或者b如果a是假的:

10 || 20; //evaluates to 10 
undefined || 20; //evaluates to 20 
undefined || null; //evaluates to null 

所以,如果window.kendo尚未定義,window.kendo || {cultures: {} }評估爲{cultures: {} }。否則,它已經評估爲window.kendo

這是指定的默認值,例如一個很巧妙的方法:

> function logit(s, label) { 
    label = label || "nolabel"; 
    console.log(label + ": " + s); 
} 
> logit("Hey there") 
nolabel: Hey there 
> logit("Hey there", "Fooman") 
Fooman: Hey there 
+0

是的!我懂了!這就說得通了。這很好,非常感謝你!這讓我瘋狂,但它非常簡單。 – Ciel

0

window.kendo是一種方式來獲得命名kendo一個全局變量。

kendo = window.kendo = window.kendo || { cultures: {} } 

這將設置的值,無論是本地kendo和全球kendo全球的任一值,如果它存在,或者如果全球不存在,將它設置爲等於該對象的文字。

+0

這也不是引用全局變量的唯一方法。如果你寫「myGlobal = 5」,當myGlobal還不是一個局部變量時,該變量可以在任何地方作爲「myglobal」或「window.myGlobal」訪問。設置「window.myGlobal」往往是可取的,當你想明確它。 – Katana314