Когда следует использовать точку с запятой после фигурных скобок? - программирование
Подтвердить что ты не робот

Когда следует использовать точку с запятой после фигурных скобок?

Много раз я видел точку с запятой, используемую после объявления функции, или после анонимной "возвратной" функции шаблона модуля script. Когда целесообразно использовать точку с запятой после фигурных скобок?

4b9b3361

Ответ 1

После утверждения вы используете запятую. Это утверждение:

var foo = function() {
  alert("bar");
};

потому что это назначение переменной (т.е. создание и назначение анонимной функции переменной).

Две вещи, которые spring должны учитывать, что не являются утверждениями, - это объявления функций:

function foo() {
  alert("bar");
}

и блоки:

{
  alert("foo");
}

Примечание. эта же конструкция блока без полуколонии также применяется к циклам for, do и while.

Ответ 2

Это тоже важно, если вы намерены минимизировать свой код.

Поэтому я лично добавляю один после каждого }, где ASI вставляет его.

Я написал сообщение о ASI в JavaScript.

Ответ 3

Не используйте точку с запятой:

... если это только объявление вашей ежедневной функции:

function foo() {

} // No semicolon


Используйте точку с запятой:

... если это назначение:

var foo = function() {

}; // Semicolon


... или функцию самозапуска:

(function () {

})(); // Semicolon

Ответ 4

Вам никогда не понадобится; вы всегда можете (кроме до else и while).

Объяснение:

К сожалению, точки с запятой Javascript не являются обязательными.
Поэтому вам никогда не нужно добавлять точку с запятой.

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

Поэтому лучше всего поставить точку с запятой после следующих двух фигурных скобок (только):

var myFunc = function() { };
var myobject = { };

Ответ 5

Если у нас есть функция self-invoking, нам нужно поставить точку с запятой перед ней, иначе она станет частью предыдущего оператора присваивания. Рассмотрим следующее:

testClass = function(name) {
  document.write ("Instantiating testClass<br />");
  this.name = name;
}

testClass.prototype.report = function() {
  document.write ("I'm " + this.name + "<br />");
  return 1;
}

testClass.prototype.testMethod = function(param) {
  document.write ("Running testMethod with parameter value " + param + "<br />");
  return 2;
} // notice that there is no semicolon here

(function() {
  document.write ("Running self-invoking function<br />");
  return 3;
}());

if (typeof(testClass.prototype.testMethod) !== "function") {
  document.write ("testMethod type: " + typeof(testClass.prototype.testMethod));
  document.write (", value: " + testClass.prototype.testMethod + "<br />");
}
var testOb = new testClass("Bill");
testOb.report();
testOb.testMethod(4);


Это даст следующий результат:

"Запуск функции самостоятельного вызова
Запуск testMethod с значение параметра 3
testMethod type: number, value: 2
Создание экземпляра testClass
Я - Билл"

... плюс ошибка JavaScript, сообщаемая браузером: testOb.testMethod is not a function

Это, конечно, не то, что мы намеревались. Почему testMethod работает немедленно, прежде чем мы даже создадим экземпляр класса? И почему это больше не существует, когда мы хотим назвать его как метод-член?

Что происходит, так это то, что testMethod назначается не наше определение функции, а возвращаемое значение определения функции. И само определение функции запускается анонимно. Вот как:

  • Конструктор testClass и метод участника report успешно определены/назначены.
  • Из-за отсутствия точки с запятой после определения для testMethod, (), окружающий следующую функцию самозапускания, становится оператором вызова, что вызывает то, что мы считаем нашим определением testMethod, чтобы стать анонимной функцией, которая вызывается немедленно, а возвращаемое значение следующей анонимной функции становится ее списком параметров. Это объясняет порядок вывода на печать - наша функция самозапуска запускается сначала, поскольку она оценивается как параметр.
  • Так как наше назначенное определение функции возвращает 2, то это 2 присваивается testMethod, а не определение функции. Это подтверждается нашей печатью типа и значения testMethod.
  • Теперь testClass успешно создается как testOb, а его метод report работает по назначению, доказывая, что определение класса в ином случае нет.
  • Когда мы пытаемся вызвать testMethod, интерпретатор говорит, что он не является функцией - и это правильно, потому что это число со значением 2.

Если мы положим точку с запятой после определения testMethod, она отделит ее назначение от вызова функции самозапускания, и мы получим ожидаемый результат:

"Запуск функции самозапускания
Создание экземпляра testClass
Я Билл
Запуск testMethod с параметром 4 "



Или мы могли бы даже поставить его прямо перед анонимной функцией:

;(function() {...

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

Ответ 6

Вы также должны использовать точку с запятой после фигурного скобки после возврата функции внутри функции в Javascript.

function watchOut(problem) {
  return function(number, location) { 
    alert("Be careful! There are " + problem +
          " today!\n" +

          number + " have been spotted at the " + location + "!"
    );
  };
}

Ответ 7

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

Ответ 8

Я знаю, что эта ветка устарела, но не могла удержаться от совместного использования этого кода:

// this will break code

a=b=c=d=e=1
a = b + c     //semicolon required here
(d + e).toString()

Вернется "Свойство объекта [object Object] не является функцией". Поскольку он будет фактически выполнен как:

a = b + c(d + e).toString()