2013-10-09 5 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), равную переменной, определенной на Окно. Я искал высоко и низко в течение часов и часов и не мог для жизни меня выяснить, где это происходит впервые. Я не смог воспроизвести такое же поведение в своем собственном коде.

Я выяснил, что функция extend служит для соединения объекта с существующим объектом и выборочно присоединяет его как доступный элемент. Но это window.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); 

затем присваивает 100 к b и еще более упрощает:

a = 100 

И, наконец, также присваивает 100 к a.


Так что, когда у вас есть следующие:

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

Сначала он присваивает результат window.kendo || {cultures: {} } к window.kendo. Затем он присваивает тот же результат локальной переменной kendo.


Окончательный трюк - это то, что window.kendo || {cultures: {} }., Точно.a || b вычисляет a если a верно, или если ba ложна:

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

Смежные вопросы