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

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

8 ответов


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

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

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

две вещи, которые приходят на ум, которые не являются утверждениями, являются объявлениями функций:

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

и блоки:

{
  alert("foo");
}

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


это тоже имеет значение, когда вы собираетесь минимизировать свой код.

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

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


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

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

function foo() {

} // No semicolon


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

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

var foo = function() {

}; // Semicolon


...или вызов функции:

(function () {

})(); // Semicolon

вам никогда не нужно; вы всегда можете (за исключением до else и while).

объяснение:

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

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

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

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

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

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 тип: число, значение: 2
Создание экземпляра testClass
я Билл"

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

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

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

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

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

" запуск функции самостоятельного вызова
создание экземпляра testClass
Я Билл!--20--> запуск testMethod со значением параметра 4"



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

;(function() {...

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


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

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

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

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


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

// 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()