В вашем коде нет названия для функции, которая является причиной синтаксической ошибки. Даже если бы у вас было имя, это привело бы к ошибке.
function func(){
console.log('x')
}();
Причина в том, что объявление функции не возвращает значения функции, однако, когда вы оборачиваете объявление функции внутри ()
, оно заставляет его быть выражением функции, которое возвращает значение.
Во втором примере function() {console.log('Inside the function')}
считается выражением, потому что оно на RightHandSide. Таким образом, он выполняется без ошибок.
Есть ли способ, которым мы можем немедленно вызвать объявление функции без использования шаблона IIFE
Вы можете использовать +
, что сделает объявление функции выражением.
+function(){
console.log('done')
}()
Если вы не хотите использовать +
и ()
, вы можете использовать new
ключевое слово
new function(){
console.log('done')
}
Extra
Очень интересный вопрос задает @ cat в комментариях. Я пытаюсь ответить на него. Есть три случая
+function(){} //returns NaN
(+function(){return 5})() //VM140:1 Uncaught TypeError: (+(intermediate value)) is not a function
+function(){return 5}() //5
+function(){}
возврат NaN
+
действует здесь как Unary Plus, который разбирает значение рядом с ним на число. Как Number(function(){})
возвращает NaN
, так и возвращается NaN
(+function(){return 5;})()
возвращает ошибку
Обычно IIFE создаются с использованием ()
. ()
используются для объявления функции, а выражение +
- короткий путь для этого. Теперь +function(){}
уже является выражением, которое возвращает NaN
. Поэтому вызов NaN
вернет ошибку. Код такой же как
Number(function(){})()
+function(){return 5;}()
возврат 5
В приведенной выше строке +
используется для выражения выражения. В приведенном выше примере сначала вызывается функция, затем +
используется для преобразования ее в число. Таким образом, приведенная выше строка такая же, как
Number(function(){return 5}())
В доказательстве утверждения "+ запускается после вызова функции" Рассмотрим приведенный ниже фрагмент
console.log(typeof +function(){return '5'}());
Таким образом, в приведенном выше фрагменте вы можете увидеть возвращаемое значение строки '5'
, но оно конвертируется в число из-за +