Javascript, объявляющий переменную [duplicate]

По вопросу «что мне делать с этим» может быть много ответов.

Более «формальный» способ предотвращения таких ошибок при разработке применяя дизайн по контракту в вашем коде. Это означает, что при разработке вы должны установить инварианты класса и / или даже предпосылки для функции и .

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

Таким образом, вы можете избежать случаев NullReferenceException, которые являются результатом нарушения установленных ограничений. Например, если вы используете свойство объекта X в классе, а затем попытаетесь вызвать один из его методов, а X имеет нулевое значение, то это приведет к NullReferenceException:

public X { get; set; }

public void InvokeX()
{
    X.DoSomething(); // if X value is null, you will get a NullReferenceException
}

Но если вы установите «свойство X никогда не должно иметь нулевого значения» в качестве предпосылки для метода, вы можете предотвратить описанный ранее сценарий:

//Using code contracts:
[ContractInvariantMethod]
protected void ObjectInvariant () 
{
    Contract.Invariant ( X != null );
    //...
}

По этой причине Код Контракт существует для приложений .NET.

В качестве альтернативы дизайн по контракту может быть применен с использованием утверждений .

ОБНОВЛЕНИЕ: Стоит отметить, что этот термин был придуман Бертраном Майером в связи с его дизайном языка программирования Эйфеля .

77
задан STW 23 September 2010 в 19:45
поделиться

10 ответов

Отсутствие производительности, просто вопрос личного выбора и стиля.

Первая версия является более сжатой.


Обновление:

Что касается количества данных, проходящих по проводу, то, конечно, меньше, тем лучше, однако для того, чтобы увидеть реальное воздействие, вам понадобится адское объявление var.

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

64
ответ дан Community 24 August 2018 в 15:53
поделиться

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

var a = doSomethingA,
    b = doSomethignB,
    c = doSomethingC;

To:

var a = doSomethingA;
var b = doSomethignB;
var c = doSomethingC;

К настоящему времени я считаю второй вариант более чистым, не говоря уже о его преимуществе решения проблемы отладчика .

Аргумент «меньше кода через провод» не является убедительным, так как существуют мини-инструменты.

21
ответ дан Cody Gray 24 August 2018 в 15:53
поделиться

Я согласен с другими респондентами в том, что это в основном вопрос личного стиля. Но чтобы привести «авторитетное» мнение в дискуссию, это то, что Дуглас Крокфорд говорит на веб-сайте популярного инструмента JSLint :

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

7
ответ дан Daniel Vassallo 24 August 2018 в 15:53
поделиться

Как отмечали другие, это предпочтение стиля. JSLint может сказать вам, что у вас есть только одна функция var за функцию (если вы используете «Хорошие детали»). Таким образом, если вы используете JSLint для проверки кода (не плохой идеи, IMHO), вы в конечном итоге используете первый формат больше, чем последний.

С другой стороны, тот же автор, Дуглас Крокфорд , говорит, что каждая переменная принадлежит своей строке в своих соглашениях кодирования . Поэтому вы можете снять флажок «Все один var за функцию» в JSLint, если вы его используете. ; -)

3
ответ дан Heretic Monkey 24 August 2018 в 15:53
поделиться

Я предпочитаю обозначение var-per-variable:

var a = 2
var b = 3

, потому что другие обозначения comma-instead-of-another-var имеют эти три недостатка:

1. Трудно поддерживать. Рассмотрим этот код:

var a = 1,
    b = mogrify(2),
    c = 3

Но эй, что делает mogrify? Выделим b, чтобы узнать:

var a = 1,
    b = mogrify(2),
    console.log(b)
    c = 3

разрывает материал

2. Трудно читать

var в попрошайничестве строки четко сообщает, что будет инициирована новая переменная.

var get_all_unicorn_promise = db.get_all_unicorns((unicorn) => {
        unicorn.legs.map((leg) => {
            leg.log('yes')
        })
    }).sort(),
    c = 3

Что, черт возьми, c = 3 делает там право ?

3. Не согласуется

. Рассмотрим это:

var a = 1,
    b = 2,
    c = 3

С var-per-variable каждое объявление следует той же структуре. С comma-instead-of-another-var первая переменная объявляется иначе, чем другие. Если вы решите, скажем, перенести первую переменную внутри цикла for, вам придется добавить var в середину объявлений

. Помимо предпочтений, похоже, что большинство известных проектов используют var-per-variable обозначение

12
ответ дан Martin Gottweis 24 August 2018 в 15:53
поделиться

Я не думаю, что есть какая-то заметная разница, насколько мне известно, это просто личное предпочтение.

Мне очень жаль, что у меня есть несколько объявлений var, поэтому я обычно делаю:

var 
   one
  ,two
  ,three
  ,four
;

Поскольку он короче и, возможно, более читабельен, нет шума var для просмотра.

-1
ответ дан meder omuraliev 24 August 2018 в 15:53
поделиться

Я предпочитаю вторую версию (у каждого есть свой var). Я думаю, это потому, что я родом из C ++. В C ++ вы можете объявлять переменные, как в первом примере, но на него нахмурились (это легко приводит к ошибкам, когда вы пытаетесь создать указатели таким образом).

0
ответ дан rmeador 24 August 2018 в 15:53
поделиться

Если вы уменьшаете свой javascript, существует довольно большое преимущество:

var one, two, three, four;

становится

var a, b, c, d;

Где в качестве

var one;
var two;
var three;
var four;

становится

var a;
var b;
var c;
var d;

Это дополнительные три экземпляра var, которые могут складываться с течением времени.

См. статью «A List Apart» серии «Лучшая Javascript Minification» Часть 1 и Часть 2

1
ответ дан Ryan Kinal 24 August 2018 в 15:53
поделиться

Поскольку я не вижу ссылок на него, здесь является ссылкой на спецификацию ECMA-262, которая является базовым спецификацией для JavaScript. Грамматика с этой страницы говорит:

12.2 Variable Statement

Syntax

  VariableStatement :
    var VariableDeclarationList ;

  VariableDeclarationList :
    VariableDeclaration
    VariableDeclarationList , VariableDeclaration

  VariableDeclarationListNoIn :
    VariableDeclarationNoIn
    VariableDeclarationListNoIn , VariableDeclarationNoIn

  VariableDeclaration :
    Identifier Initialiseropt

  VariableDeclarationNoIn :
    Identifier InitialiserNoInopt

  Initialiser :
    = AssignmentExpression
  InitialiserNoIn :
    = AssignmentExpressionNoIn

То, что вы можете извлечь из этого, использует запятые или нет, не имеет значения. В любом случае, он заканчивается анализом как VariableDeclaration и обрабатывается точно так же. Не должно быть никакой разницы в том, как механизм сценария обрабатывает два объявления. Единственные различия были бы уже упомянуты в других ответах - сэкономить больше пространства и практически неизмеримые различия в количестве времени, которое требуется для применения грамматики, чтобы найти все VariableDeclarations при компиляции скрипта.

1
ответ дан Scott Mermelstein 24 August 2018 в 15:53
поделиться

Первый сохраняет несколько символов - таким образом, существует очень небольшая экономия с точки зрения размера JS и, следовательно, потребления полосы пропускания. Единственный момент, когда это станет заметным, будет в крайних случаях.

1
ответ дан STW 24 August 2018 в 15:53
поделиться
Другие вопросы по тегам:

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