Подтвердить что ты не робот

Является ли определение каждой переменной наверху наилучшим образом наилучшим подходом?

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

// Beginning of file

function something(){
    var a, b, c = 1, d, e;
    // Do something
}

// End of file

- хороший пример (конечно, без имен неправильной переменной).

Мой вопрос: всегда ли это лучший подход? Что делать, если вы работаете с множеством переменных? Должны ли они действительно все просто быть наброшены на одну линию?

4b9b3361

Ответ 1

"Должны ли они на самом деле просто плюхнуться на одну строку?"

Я так не думаю.

Вот как я писал бы это (игнорируя имена):

function something(){
    var a,
        b,
        c = 1,
        d,
        e;
    // Do something
}

Это выглядит глупо в приведенном выше примере: 1) имена сосать 2) переменные не назначаются в "объявлении" - большинство кода могут быть записаны с неизменяемыми (назначенными однократно) переменными, и я нахожу это для упрощения кода, Я использую это по нескольким причинам, включая ясность и устойчивость к форматированию изменений (т.е. Я могу изменять начальные значения, добавлять/удалять объявления и т.д., Не отбрасывая форматирование других строк).

"Определяет ли каждая переменная в верхней части всегда лучший подход?"

Я так не думаю.

Например, вот как я пишу петли:

for (var i = 0; i < x; i++) {
  var elm = elms[i];
  ...
}

И некоторые люди поедут "НО ВАРИАНТЫ ДОЛЖНЫ ВЕРНУТЬ ФУНКЦИЮ!" или "ПЕРЕМЕННАЯ ФУНКЦИЯ-СКОРОСТЬ!". Ну, действительно. Тем не менее, это позволяет мне легко визуально видеть, что это ошибка, даже если механизм JavaScript не поможет:

for (var i = 0; i < x; i++) {
  var elm = elms[i];
  ...
}
...
// valid JS but since I consider this construct *invalid*
// I know this is a *bug* in my code
alert(elm);

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

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

Я использую эти подходы к /, потому что:

  • У вас есть последовательный простой в использовании код.
  • Введите код, который сообщает мне, когда это неправильно.
  • Я предпочитаю код, который можно изменить для изменения без изменения структуры.
  • Самодокументирующий код означает меньше комментариев.
  • Мне нравится "читать по вертикали"

Счастливое кодирование.

Ответ 2

Я бы очень хотел предложить Code Complete 2 от Steve McConnell прочитать. Его аргумент заключается в том, что вы не должны объявлять все свои переменные в одной строке и не должны объявлять их всех в верхней части подпрограммы. Итак, не делайте этого:

function foo() {
    var a,
        b,
        c,
        d;

     /**
      * 20 lines that use a and b
      */

     /**
      * 10 lines that use c and d
      */
}

Вместо этого вы должны объявить переменные рядом с тем, где они нужны. В приведенном выше коде это может выглядеть так:

function foo() {
    var a,
        b;

     /**
      * 20 lines that use a and b
      */

     var c,
         d;

     /**
      * 10 lines that use c and d
      */
}

Преимущества в том, что вы можете быстро понять, какие переменные используются блоком кода, просто просматривая объявления над ним. Вам не нужно читать код, чтобы увидеть, какие переменные установлены, только те, которые объявлены.

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

Ответ 3

В языках с областью блока обычно рекомендуется объявлять переменные на сайте первого использования.

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

EDIT: многие люди работают на нескольких языках одновременно. Часто JavaScript является единственным среди них без области блока.

Ответ 4

Это вопрос стиля. Не вопрос функциональности.

Парсер javascript возьмет этот код

function() {
   dostuff();
   var i = 4;
}

и превратите его в:

function() {
   var i;
   dostuff();
   i = 4;
}

Что касается вопроса стиля. Нет, спасибо, я думал, что мы оставили это с ANSI C.

Что вы хотите сделать, это объявить функции в верхней части своей "области"

Если "scope" переменной - это целая функция, объявите ее вверху. Если "scope" является подмножеством функции, объявите их в начале подмножества.

рассматривать "область действия" как логическую область, а не область действия.

Это должно обеспечить максимальную читаемость.

Ответ 5

Я бы рискнул сказать, что в более старых структурах (например, C\С++ days) было важно инициализировать ваши переменные и назначить им начальное значение. Но с тем, как все происходит, я считаю, что объявление их "при необходимости" является действительной реализацией. Если область не играет роль (например, вам нужна переменная a не только в этой функции, но и в других функциях тоже), я бы объявил на ходу.

Возможно, это просто образ мышления, но я склонен объявлять вещи на основе области (если переменная нужна только в условии if или нескольких строках кода, я объявлю ее там (а не наверху моя функция/класс). Если я не пройду через этот путь кода, я думаю, что это будет сохранение распределения памяти, и оно не будет объявлено "без причины".)

Я мог быть совершенно неправ. В любом случае JavaScript позволит вам объявлять свои переменные любым способом, который вы считаете самым легким для чтения.

Ответ 6

Это действительно вопрос предпочтения. Например, если мой метод содержит только цикл for, то я не буду извлекать переменные цикла вверху:

var func = function(arr) {
    for (var i = 0, len = arr.length; i < len; i++) {
        // array processing here
    }
}

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