Много раз я видел точку с запятой, используемую после объявления функции, или после анонимной "возвратной" функции шаблона модуля script. Когда целесообразно использовать точку с запятой после фигурных скобок?
Когда следует использовать точку с запятой после фигурных скобок?
Ответ 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()