“Uncaught TypeError: 5 is not a function” при присваивании 5 в переменную [закрыт]

158
05 июля 2019, 15:00

Почему данный код приводит к возникновению ошибки?

var a = 5 
 
(function() { 
  // ... 
})();

Answer 1

Если не ставить ; там, где это требуется, то в некоторых ситуациях точки с запятой будут подставлены автоматически. Однако есть ситуации, в которых ; подставлена не будет, и в итоге код будет обработан совсем не так, как планировалось.

В спецификации в разделе 7.9.2 есть пример, в котором ; не будет подставлена, и который похож на пример из вопроса:

a = b + c
(d + e).print()

is not transformed by automatic semicolon insertion, because the parenthesised expression that begins the second line can be interpreted as an argument list for a function call:

a = b + c(d + e).print()

В примере из вопроса суть сводится к тому, что конструкция 5(function() {...}) воспринимается как вызов функции 5 и передача ей в качестве аргумента функции. () же в конце воспринимается как вызов результата выполнения 5 как функции

Пример того как это выполняется (5 заменено на f, потому что не очень-то получится объявить функцию с именем в виде числа):

function f(func) { 
  func(); 
  return function(number) { 
    console.log(number); 
  }; 
} 
 
var a = f 
 
(function() { 
  console.log("func"); 
})(10);

READ ALSO
Не работает захват видео в Safari

Не работает захват видео в Safari

Подскажите, какое API можно использовать для захвата видео в Safari

158
Изменение стиля блока с hover подсказкой JS

Изменение стиля блока с hover подсказкой JS

При наведении всплывает подсказка с текстом,все отлично работает но необходимо, чтобы весь блок с картинкой позади затемнялся, при всплывании...

123
Запись аудиофайла на javascript

Запись аудиофайла на javascript

Для создания приложения с использованием yandex speech kitЕго использование предполагае запись аудиофайла в формате ogg или lpcm и отправкой его на сервер

122