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

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

Ответы [ 8 ]

94 голосов
/ 27 апреля 2010

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

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

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

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

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

и блоки:

{
  alert("foo");
}

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

22 голосов
/ 27 апреля 2010

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

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

Я написал пост о ASI в JavaScript .

16 голосов
/ 02 января 2013

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

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

function foo() {

} // No semicolon


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

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

var foo = function() {

}; // Semicolon


... или функция, вызывающая себя:

(function () {

})(); // Semicolon
10 голосов
/ 27 апреля 2010

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

Пояснение:

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

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

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

var myFunc = function() { };
var myobject = { };
5 голосов
/ 26 февраля 2013

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

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
Insttiating testClass
I'm Bill "

... плюс ошибка 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
Я Билл
Я использую testMethod со значением параметра 4 "



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

;(function() {...

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

2 голосов
/ 16 марта 2015

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

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

          number + " have been spotted at the " + location + "!"
    );
  };
}
0 голосов
/ 24 января 2014

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

// this will break code

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

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

a = b + c(d + e).toString()
0 голосов
/ 27 апреля 2010

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...