Ответ 1
В вашем коде нет названия функции, которая является причиной синтаксической ошибки. Даже если бы у вас было имя, это привело бы к ошибке.
function func(){
console.log('x')
}();
Я пытаюсь немедленно вызвать функцию без использования шаблона IIFE (заключив определение функции в круглые скобки). Здесь я вижу два сценария:
Когда объявление функции вызывается немедленно: выдает SyntaxError
.
Когда выражение функции вызывается немедленно: выполняется успешно.
Пример 1: дает SyntaxError
//gives 'SyntaxError'
function() {
console.log('Inside the function');
}();
В вашем коде нет названия функции, которая является причиной синтаксической ошибки. Даже если бы у вас было имя, это привело бы к ошибке.
function func(){
console.log('x')
}();
Объявление функции, как
function foo() {
}
определяет (и поднимает) имя переменной foo
как функцию в текущей области видимости. Объявление функции не оценивается как значение; он просто что-то делает, немного как if
то что-то делает (а не оценивает значение).
Вы можете вызывать только те значения, которые являются функциями, например
<somevalue>()
где somevalue
- это имя переменной, которая ссылается на функцию.
Обратите внимание, что объявления функций требуют имен функций, потому что в противном случае нет имени переменной, чтобы назначить функцию - ваш оригинал
//gives 'SyntaxError'
function() {
console.log('Inside the function');
}();
E в IIFE обозначает выражение, и без круглых скобок ваша функция не оценивается как выражение, таким образом, синтаксическая ошибка.
создание выражения - это способ обмануть интерпретатор и сразу вызвать функцию
(function() {
console.log('Inside the function');
})();
Не знаю, почему вы хотите это сделать, но:
Есть ли способ, которым мы можем немедленно вызвать объявление функции без использования шаблона IIFE?
Хорошо, если для объявления функции вы имеете в виду использование ключевого слова function
как в:
function name() { return this.name; }
Насколько я знаю, нет. Вам нужны дополнительные скобки, чтобы указать среде выполнения не назначать функцию переменной name
, если я правильно понимаю этот материал.
Теперь, что вы действительно можете сделать, это использовать Function
как в:
new Function('console.log("ey there")')();
Который будет выполнять код console.log
. Нет необходимости в IIFE здесь. Но я не понимаю, как это может быть лучше, чем IIFE.
Чтобы вызвать что-то, это должно быть значение функции, объявление просто объявляет имя и не оценивает само значение функции, поэтому вы не можете вызвать его.
Объявление не может быть вызвано по вышеуказанной причине. Вы должны каким-то образом получить выражение, либо с помощью присваивания, либо с помощью группировки (IIFE). Так что это нет.
Если вы дадите нам больше контекста о том, почему вы хотите это сделать, возможно, мы сможем помочь с предложениями.
Первый фрагмент кода не является IIFE
. Это просто декальрация функции. Вы не можете вызвать функцию в том же месте без IIFE
.
Второй фрагмент кода на самом деле является IIFE
. Это выглядит как выражение функции, но на самом деле это IIFE
.
Этот способ объявления IIFE
используется, когда вы должны использовать recursion
в IIFE
. Обычный IIFE
не имеет никакого имени, поэтому вы не можете использовать его. Однако, если вы объявляете IIFE
, как вы сделали во втором фрагменте кода, вы можете вызвать x()
изнутри IIFE
и, следовательно, вы можете написать рекурсивный код.
Вы можете сделать что-то вроде:
var x = function() {
console.log('Inside the function')
x(); //recurses forever
}();
К вашему последнему утверждению, нет, вы не можете немедленно вызвать функцию без IIFE
.
Вы можете позвонить одним из следующих способов -
~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") }()