【问题标题】:When I log typeof an IIFE to the console, it is an object instead of a function, why?当我将 IIFE 的 typeof 记录到控制台时,它是一个对象而不是函数,为什么?
【发布时间】:2017-01-22 06:07:44
【问题描述】:

我有一个返回对象的 IIFE。在我添加到 index.html 中的脚本标记的 app.js 文件中,我登录到我的 IIFE 的控制台类型,它是一个对象。它不应该是一个函数吗?为什么 typeof 会返回一个对象?

这是我在 app.js 中的 IIFE:

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);

【问题讨论】:

  • 我不明白。您正在使用术语“IIFE”,这听起来就像您确实了解这段代码是什么;但是你问为什么你得到的是一个对象而不是一个函数,这听起来就像你理解这段代码是什么。你认为 IIFE 是什么?你为什么期望得到一个函数?
  • 我明白它的作用,但是为什么 typeof UIController 是一个对象而不是一个函数呢?如果我写了一个函数表达式并将它的类型记录到控制台,那将是一个函数,而不是一个对象,那么为什么在这种情况下我会得到对象呢?
  • "foo"string 时,为什么var x = "foo".length; typeof x 返回number
  • IIFE 的重点在于它是立即执行的。问问自己:当你的 IIFE 立即执行时,它会返回什么?你已经在第一句话中给出了答案。它是一个对象。

标签: javascript iife


【解决方案1】:

IIFE 代表“立即调用的函数表达式”。换句话说,通过调用函数创建的表达式调用函数意味着调用函数并产生结果。 IIFE 的值是调用(调用)函数的结果,而不是函数本身。

在您的示例中,变量UIController 被分配了调用函数的结果。您的函数返回一个具有两个属性的对象。该对象分配给UIController。所以typeof UIController 按预期产生object

【讨论】:

  • 好的,现在很有意义。感谢您的非批判性回答。
  • 很好。这一点都不明显,也不容易混淆。
【解决方案2】:

**记住立即调用的函数表达式函数 (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

【讨论】:

    猜你喜欢
    • 2021-12-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-05-31
    • 1970-01-01
    • 2015-09-01
    • 2014-09-13
    • 2015-02-18
    相关资源
    最近更新 更多