2013-10-09 44 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