Требуется ли точка с запятой перед закрытием функции в javascript? - PullRequest
1 голос
/ 18 мая 2019

Мне интересно, если это ошибка компилятора, или это так, как и должно быть.

При использовании node.js v10.15.3 этот код выдает ошибку:

var x
x = false
(function y() { console.log('foo') }())

Но этот код работает нормально:

var x
x = false;
(function y() { console.log('foo') }())

Это точка с запятой, которая имеет значение.Сообщение об ошибке: «TypeError: false не является функцией», поэтому кажется, что без точки с запятой компилятор анализирует открытое представление после ключевого слова «false» как вызов функции, как если бы я написал «x = false»()».Мне потребовалось много времени, чтобы выяснить, что пошло не так в моем коде (который, конечно, был более сложным, чем приведенный выше пример). Это часть моей жизни, которую я не верну!

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

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

Ответы [ 3 ]

2 голосов
/ 18 мая 2019

JavaScript-парсер видит это

var x
x = false
(function y() { console.log('foo') }())

как это:

var x;
x = false(function y() { console.log('foo') }());

, что означает, что вы пытаетесь вызвать false как функцию. Это потому, что парсер JS всегда пытается получить самое длинное выражение.

В большинстве случаев писать JS с точкой с запятой или без нее - это просто вопрос стиля. Однако вам нужно добавить точки с запятой, когда:

  • Есть 2 строки кода и
  • первая строка заканчивается возможным идентификатором (или ключевыми словами, такими как if или while) и
  • Вторая строка начинается с скобки.

В этом случае точку с запятой следует добавлять в конец первой строки или в начало второй строки.

0 голосов
/ 18 мая 2019

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

Рассмотрим приведенный ниже фрагмент, где вложенная функция вызывается с двумя (), а вызов разделяется одной строкой. Но это не имеет значения.

function x(){
  return function(){ return 6}
}
let a =
x()

()
console.log(a) //6

Приведенная выше строка все равно будет оцениваться как

let a = x()()

Общее правило: когда код имеет смысл и не выдает ошибку без точки с запятой. Это не вставляет полуцвет там. Точка с запятой вставляется только тогда, когда другого выбора нет.

0 голосов
/ 18 мая 2019

Вы правы, когда ложно вызывается как функция.Ваш первый кодовый блок эквивалентен этому:

var x
x = false(function y() { console.log('foo') }())

Поскольку точка с запятой не разделяет строки, интерпретатор js вызывает ключевое слово false, передавая функцию y в качестве аргумента .Это, очевидно, приводит к ошибке, поскольку false не вызывается.

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

var x
x = false
;(function y(){...})
...