Когда следует использовать точку с запятой после фигурных скобок?
много раз я видел точку с запятой, используемую после объявления функции или после анонимной функции "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
назначается не наше определение функции, а возвращаемое значение определения функции. И определение функции сам управляется анонимно. Вот как:
- на
testClass
конструктор и метод членreport
успешно определен/назначен. - из-за отсутствия точки с запятой после определения для
testMethod
на()
окружение следующей самозваной функции становится оператором вызова, который вызывает то, что мы считаем нашим определениемtestMethod
чтобы стать анонимной функцией, которая вызывается немедленно, и возвращаемое значение следующей анонимной функции становится ее списком параметров. Это объясняет порядок печатного вывода-наша самозваная функция запускается первой, поскольку она оценивается как параметр. - поскольку наше определение предполагаемой функции возвращает 2, именно это 2 назначается
testMethod
и не определение функции. Это подтверждается нашей печатью типа и значенияtestMethod
. - теперь
testClass
успешно создается какtestOb
иreport
метод работает по назначению, доказывая, что определение класса в противном случае неповреждено. - когда мы пытаемся назвать
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()