Недостатки Javascript «единый шаблон var» - PullRequest
5 голосов
/ 21 декабря 2011

В книге Стефанова «Шаблоны проектирования JS» он пишет: «Вы используете один оператор var и объявляете несколько переменных, разделенных запятыми», а затем приводит пример шаблона «single var» следующим образом:

function func() {
    var a = 1,
        b = 2,
        sum = a + b,
        myobject = {},
        i,
        j;

Стефанов дополнительно пишет:

  • "Хорошей практикой также является инициализация переменной начальным значением во время ее объявления."
  • «Вы также можете выполнить некоторую фактическую работу во время объявления, как в случае с sum = a + b в предыдущем коде.»

Теперь у меня есть следующий код, который объявляет то же количество переменных с одним шаблоном var, но выполняет немного больше «фактической работы во время объявления»:

var html = '{purchaseQty}<br>FR:&nbsp; {fromLoc}'
    ,tpl = new Ext.XTemplate(html)
    ,srcReqLoc = record.get('SRC_REQUEST_LOC').trim()
    ,srcSupLoc = record.get('SRC_SUP_LOC').trim()
    ,fromLoc = srcReqLoc ? srcReqLoc : srcSupLoc
    ,tplCfg = {
        purchaseQty: purchaseQty
        ,fromLoc: fromLoc
    };

Каковы недостатки выполнения слишком большого количества «фактической работы на момент объявления»? Кстати, я не считаю это точной копией шаблона единой переменной Javascript. Я перегружаю его? , потому что я спрашиваю об общих недостатках, а не о том, что может быть не так с только моим кодом.

Думаю, я вижу, что общим недостатком будет невозможность проверки ошибок, например, когда в моем примере я вызываю trim () для строк, ожидаемых от record.get, но если вместо него возвращается undefined, может "can" t вызов метода для неопределенного объекта "(или что бы то ни было;) будет брошено. Кто-нибудь может придумать что-нибудь еще?

Ответы [ 3 ]

6 голосов
/ 21 декабря 2011

Я лично поддерживаю Дугласа Крокфорда (хотя я ценю тех, кто этого не делает), что объявление переменных в верхней части функции имеет больше смысла, потому что JavaScript не имеет области видимости блока.

С сайта JSLint :

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

Единственным недостатком является то, что ваш код будет менее читаемым для кого-либо из C или C-фона.

Я опасаюсь, что я мог бы звучать здесь как фанат Крокфорда, но я бы рекомендовал этот доклад о стиле кодирования и почему иногда ваш мозг должен управлять вашим сердцем с помощью структуры кода (в зависимости от языка ).

5 голосов
/ 21 декабря 2011

Имеет смысл объявить все переменные в верхней части области видимости, то есть в начале функции или в начале глобального кода.Я согласен с этим.

Что касается предоставления начальных значений во время декларации, я принимаю это как нечто большее.В общем, - это хороший план, и, конечно, он работает для простых значений, но иногда начальное значение не известно до тех пор, пока не будут выполнены более сложные вычисления - в этом случае я бы не предоставил значение по умолчанию, которое никогда не используетсяпросто ради обеспечения некоторой ценности.И иногда это становится слишком беспорядочным.

Кроме того, я бы не стал давать переменным индекса цикла начальное значение во время объявления - для меня намного яснее присвоить значение в начале цикла.

Как вы уже указали, если вам нужно обрабатывать исключения и т. Д., Вам нужно будет сделать это позже и в функции.

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

Для меня ваш пример кода в порядке, но если вам нужнодобавив к нему гораздо больше, было бы немного трудно читать, потому что с таким большим количеством кода в плотном блоке я не могу выбрать имена переменных так же легко, но - и это, очевидно, дело вкуса - вы можете добавитьнекоторые пробелы:

var html       = '{purchaseQty}<br>FR:&nbsp; {fromLoc}'
    ,tpl       = new Ext.XTemplate(html)

    ,srcReqLoc = record.get('SRC_REQUEST_LOC').trim()
    ,srcSupLoc = record.get('SRC_SUP_LOC').trim()    
    ,fromLoc   = srcReqLoc ? srcReqLoc : srcSupLoc

    ,tplCfg    = {
        purchaseQty: purchaseQty
        ,fromLoc: fromLoc
    };

(Выровняйте знаки = или сгруппируйте переменные, связанные с пустыми строками, или оба.)

1 голос
/ 08 августа 2017

Поскольку это довольно старое и больше не совсем актуально, полезно указать людям, приезжающим сюда из мира es6, что у нас сейчас есть блок-область.

В любом случае Hoisting помещает все объявленные переменные var в верхнюю часть области действия функции, но иногда, когда вы кодируете, вы понимаете, что переменная используется только в определенном блоке - в этом случае let предпочтительнее - или даже в том, что переменная won ' изменить ссылку, и в этом случае const - лучшая идея.

...