Функциональное выражение с использованием IIFE в качестве параметра?

Ниже работает как задумано

var dogName = function animalName(name) {
  console.log("My name is " + name);
}

dogName('Scruffy');

(function () {
    console.log("My name is Fido!");
})();

Если вы закомментируете dogName('Scruffy'); это выводит это

My name is function () {
  console.log("My name is Fido!");
}

Если вы отрегулируете IIFE на

(function () {
  console.log("My name is Fido!");
}()); // ()) instead of )()

Выводит

My name is Fido!
My name is undefined

Почему функциональное выражение использует IIFE в качестве своей переменной имени, и почему IIFE выполняется первым перед функциональным выражением в последнем примере?

1 ответ

Решение

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

var dogName = function animalName(name) {
  console.log("My name is " + name);
}(function () {
    console.log("My name is Fido!");
})();

Насколько интерпретатор может сказать, вы передаете функцию в качестве первого аргумента выражению именованной функции, а затем пытаетесь вызвать возвращаемое значение как функцию.

Чтобы это исправить, просто поставьте точку с запятой в конце выражения.

var dogName = function animalName(name) {
  console.log("My name is " + name);
}; // <--

(function () {
    console.log("My name is Fido!");
})();

Другие вопросы по тегам