Сразу же вызывается выражение функции без использования оператора группировки

Я пытаюсь немедленно вызвать функцию без использования шаблона IIFE (заключив определение функции в круглые скобки). Здесь я вижу два сценария:

  1. Когда объявление функции вызывается немедленно: выдает SyntaxError.

  2. Когда выражение функции вызывается немедленно: выполняется успешно.

Пример 1: дает SyntaxError

//gives 'SyntaxError'
function() {
    console.log('Inside the function');
}();

Ответ 1

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

function func(){
  console.log('x')
}();

Ответ 2

Объявление функции, как

function foo() {
}

определяет (и поднимает) имя переменной foo как функцию в текущей области видимости. Объявление функции не оценивается как значение; он просто что-то делает, немного как if то что-то делает (а не оценивает значение).

Вы можете вызывать только те значения, которые являются функциями, например

<somevalue>()

где somevalue - это имя переменной, которая ссылается на функцию.

Обратите внимание, что объявления функций требуют имен функций, потому что в противном случае нет имени переменной, чтобы назначить функцию - ваш оригинал

//gives 'SyntaxError'
function() {
    console.log('Inside the function');
}();

Ответ 3

E в IIFE обозначает выражение, и без круглых скобок ваша функция не оценивается как выражение, таким образом, синтаксическая ошибка.

создание выражения - это способ обмануть интерпретатор и сразу вызвать функцию

(function() {
    console.log('Inside the function');
})();

Ответ 4

Не знаю, почему вы хотите это сделать, но:

Есть ли способ, которым мы можем немедленно вызвать объявление функции без использования шаблона IIFE?

Хорошо, если для объявления функции вы имеете в виду использование ключевого слова function как в:

function name() { return this.name; }

Насколько я знаю, нет. Вам нужны дополнительные скобки, чтобы указать среде выполнения не назначать функцию переменной name, если я правильно понимаю этот материал.

Теперь, что вы действительно можете сделать, это использовать Function как в:

new Function('console.log("ey there")')();

Который будет выполнять код console.log. Нет необходимости в IIFE здесь. Но я не понимаю, как это может быть лучше, чем IIFE.

Ответ 5

Чтобы вызвать что-то, это должно быть значение функции, объявление просто объявляет имя и не оценивает само значение функции, поэтому вы не можете вызвать его.

Объявление не может быть вызвано по вышеуказанной причине. Вы должны каким-то образом получить выражение, либо с помощью присваивания, либо с помощью группировки (IIFE). Так что это нет.

Если вы дадите нам больше контекста о том, почему вы хотите это сделать, возможно, мы сможем помочь с предложениями.

Ответ 6

Первый фрагмент кода не является IIFE. Это просто декальрация функции. Вы не можете вызвать функцию в том же месте без IIFE.

Второй фрагмент кода на самом деле является IIFE. Это выглядит как выражение функции, но на самом деле это IIFE.

Этот способ объявления IIFE используется, когда вы должны использовать recursion в IIFE. Обычный IIFE не имеет никакого имени, поэтому вы не можете использовать его. Однако, если вы объявляете IIFE, как вы сделали во втором фрагменте кода, вы можете вызвать x() изнутри IIFE и, следовательно, вы можете написать рекурсивный код.

Вы можете сделать что-то вроде:

var x = function() {
           console.log('Inside the function') 
           x(); //recurses forever
        }();

К вашему последнему утверждению, нет, вы не можете немедленно вызвать функцию без IIFE.

Ответ 7

Вы можете позвонить одним из следующих способов -

~function(){console.log("hi")}()
!function(){console.log("hi")}()
+function(){console.log("hi")}()
-function(){console.log("hi")}()
(function(){console.log("hi")}());
var i = function(){console.log("hi")}();
true && function(){ console.log("hi") }();
0, function(){ console.log("hi") }();
new function(){ console.log("hi") }
new function(){ console.log("hi") }()