JavaScript - Преимущества литерала объектов

Давайте смотреть... Странно "functionName =" генерирует меньше IL?

Код:

Public Function Test() As String
    Test = "Test"
End Function


Public Function Test2() As String
    Return "Test"
End Function

IL:

.method public static string Test() cil managed
{
    .maxstack 1
    .locals init (
        [0] string Test)
    L_0000: nop 
    L_0001: ldstr "Test"
    L_0006: stloc.0 
    L_0007: ldloc.0 
    L_0008: ret 
}

.method public static string Test2() cil managed
{
    .maxstack 1
    .locals init (
        [0] string Test2)
    L_0000: nop 
    L_0001: ldstr "Test"
    L_0006: stloc.0 
    L_0007: br.s L_0009
    L_0009: ldloc.0 
    L_000a: ret 
}
38
задан Russ Cam 21 October 2009 в 11:19
поделиться

3 ответа

Как сказал Расс Кам, вы избегаете загрязнения глобального пространства имен, что очень важно в наши дни объединения скриптов из нескольких мест (TinyMCE и т. Д.).

Как сказал Алекс Секстон: это также способствует хорошей организации кода.

Если вы используете эту технику, я бы предложил использовать шаблон модуля. При этом по-прежнему используются объектные литералы, но в качестве возвращаемого значения из функции области видимости:

var MyThingy = (function() {

    function doSomethingCool() {
        ...
    }

    function internalSomething() {
        ....
    }

    function anotherNiftyThing() {
        // Note that within the scoping function, functions can
        // call each other direct.
        doSomethingCool();
        internalSomething();
    }

    return {
        doSomethingCool: doSomethingCool,
        anotherNiftyThing: anotherNiftyThing
    };
})();

Внешнее использование:

MyThingy.doSomethingCool();

Функция области видимости оборачивается вокруг всех ваших функций, а затем вы немедленно вызываете ее и сохраняете ее возвращаемое значение. Преимущества:

  • Функции объявляются нормально и поэтому имеют имена . (В то время как в формате {name: function () {...}} все ваши функции являются анонимными, даже если свойства, ссылающиеся на них, имеют имена.) Инструменты помощи по именам помогают вам, от отображения стеков вызовов в отладчике до сообщения о том, какая функция вызвала исключение. (Обновление 2015: последняя спецификация JavaScript, 6-е издание ECMAScript, определяет большое количество способов, которыми механизм JavaScript должен вывести имя функции. Один из них - когда функция назначается свойству, как в нашем {name: function () {...}} пример. Так как движки реализуют ES6, эта причина исчезнет.)
  • Дает вам свободу иметь частные функции, используемые только вашим модулем (например, как мой internalSomething выше). Никакой другой код на странице не может вызывать эти функции; они действительно личные. Только те, которые вы экспортируете в конце, в операторе return, видны за пределами функции области видимости.
  • Упрощает возврат различных функций в зависимости от среды, если реализация просто полностью изменится (например, IE-vs-W3C, SVG или Canvas и т. д.).

Пример возврата различных функций:

var MyUtils = (function() {
    function hookViaAttach(element, eventName, handler) {
        element.attachEvent('on' + eventName, handler);
    }

    function hookViaListener(element, eventName, handler) {
        element.addEventListener(eventName, handler, false);
    }

    return {
        hook: window.attachEvent ? hookViaAttach : hookViaListener
    };
})();

MyUtils.hook(document.getElementById('foo'), 'click', /* handler goes here */);
66
ответ дан 27 November 2019 в 03:17
поделиться

Использование литерала объекта (также известного как шаблон литерала объекта) не будет загрязнять глобальное пространство имен так сильно, как использование многих функций, объявленных глобально, а также помогает организовать код логическим образом

Для Например, этот литерал объекта

var obj = {
              find : function(elem) { /* find code */ },
              doSomething: function() { /* doSomething code */ },
              doSomethingElse: function() { /* doSomethingElse code */ }
          }

по сравнению с

function find(elem) { /* find code */ },
function doSomething() { /* doSomething code */ },
function doSomethingElse() { /* doSomethingElse code */ }

создаст только одно свойство глобального объекта по сравнению с тремя. Затем вы можете легко использовать такие функции, как

obj.doSomething();
15
ответ дан 27 November 2019 в 03:17
поделиться

Ребекка Мерфи выступила с докладом об объектных литералах на конференции jQuery в этом году. Одна из лучших причин их использования - это просто хорошая организация кода.

Вот запись Ребекки о шаблоне литерала объекта: http://rmurphey.com/blog/2009/10/15/using-objects -to-организовать-ваш-код / ​​

10
ответ дан 27 November 2019 в 03:17
поделиться
Другие вопросы по тегам:

Похожие вопросы: