Когда я записываю typeof IIFE на консоль, это объект вместо функции, почему?

У меня есть IIFE, который возвращает объект. В моем файле app.js, который я добавляю в тег сценария в index.html, я регистрирую в консоли тип своего IIFE, и это объект. Разве это не должно быть функцией? Почему typeof возвращает объект?

Вот мой IIFE в app.js:

var UIController = (function() {

  var DOMstrings = {
    inputType: '.add__type',
    description: '.add__description',
    value: '.add__value',
    addBtn: '.add__btn'
  };

  return {
    getInput: function() {
      // return an object containing all values from UI elements
      return {
        type: document.querySelector(DOMstrings.inputType).value, // will be either income or expense
        description: document.querySelector(DOMstrings.description).value, // description of transaction
        value: document.querySelector(DOMstrings.value).value // value of transaction
      };
    },
    getDOMStrings: function() {
      return DOMstrings;
    }
  };

})();

console.log(typeof UIController);

1 ответ

Решение

IIFE означает "немедленно вызванное выражение функции". Другими словами, выражение, созданное путем вызова функции. Вызов функции означает ее вызов и получение результата. Значение IIFE является результатом вызова (вызова) функции, а не самой функции.

В вашем примере переменная UIController присваивается результат вызова функции. Ваша функция вернула объект с двумя свойствами. Объект назначен UIController, Так typeof UIController производит object как и ожидалось.

** ПОМНИТЕ, что немедленно вызываемая ФУНКЦИЯ ВЫРАЖЕНИЯ ФУНКЦИИ (IIFE) - это функции, переменные которых не могут быть доступны вне функции, и вы не можете вызвать эту функцию явно (это приведет к ошибке) **

* вот простой код, чтобы прояснить концепцию IIFE. эта функция просто печатает эй и не имеет возвращаемого значения *

var run=(function(){
  console.log("HEY");
  
})();
run(); //error
console.log(run);  HEY
console.log(typeof(run));  undefined

* Ниже функции IIFE возвращает значение *

var run=(function(){
 return 1;
  
})();
run(); //error
console.log(run);  5
console.log(typeof(run));  number

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