0

我对 Javascript 还比较陌生,并且一直在尝试了解特定库如何管理这种干净的类型和命名约定。

有问题的库是Telerik 的 Kendo 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

特别是,让我难以置信的是第二条线。他们在哪里声明一个变量(剑道)等于在window上定义的一个变量。我已经搜索了几个小时和几个小时,但我一生都无法弄清楚这首先发生在哪里。我无法在自己的代码中重现相同的行为。

我发现扩展函数可以作为一种将对象与现有对象配对的方法,并像可访问成员一样有选择地附加它。但是那个window.kendo的东西,它让我发疯。

4

2 回答 2

2

没那么复杂。以这个为例:

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

括号可能会有所帮助:

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

c = 100实际上是一个表达式。它分配100c,然后评估给100。所以这进展到:

a = (b = 100);

然后它分配100b进一步简化:

a = 100

它最后也赋值100a


因此,当您有以下情况时:

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

首先它将结果分配给window.kendo || {cultures: {} }to window.kendo。然后它将相同的结果分配给局部变量kendo


最后的技巧是什么window.kendo || {cultures: {} },确切地说。a || b评估为aifa为 true 或bifa为 false:

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
于 2013-10-09T20:37:21.830 回答
0

window.kendo是一种获取名为的全局变量的方法kendo

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

这会将本地kendo和全局kendo的值设置为全局的值(如果存在),或者如果全局不存在,则将其设置为等于该对象字面量。

于 2013-10-09T20:37:43.547 回答