【问题标题】:Why multiple functions inside an IIFE execute the last function?为什么 IIFE 中的多个函数执行最后一个函数?
【发布时间】:2019-02-26 09:16:52
【问题描述】:

我实际上不知道这段代码的输出是一个数字。有人好心帮助理解这个例子中 JS 运行的逻辑是什么?

<script>

var f = (
  function f(){ return "1"; }, 
  function g(){ return 2; }
)();

console.log(typeof f);

</script>

【问题讨论】:

    标签: javascript html function


    【解决方案1】:

    您使用的是comma operator。你基本上在这里执行g

    逗号运算符计算其每个操作数(从左到右)并返回最后一个操作数的值

    var f = (
      function f(){ return "1"; }, 
      function g(){ return 2; }
    )()
    

    类似于:

    var temp = function g(){ return 2; }
    f = temp() // returns 2
    

    【讨论】:

    • 在某处是否有任何逻辑或规则或文档?另外,如果我在 () 中编写 10 个函数并执行它们怎么办?那会发生什么?如果最后一个什么都不返回怎么办?
    【解决方案2】:

    因为逗号操作符

    x = a, b;
    

    这将评估 a,然后评估 b,并使用 b 的结果。也就是说,只评估 a 的副作用,否则它的结果将被丢弃。

    也就是说

    var f = (
       function f(){ return "1"; }, 
       function g(){ return 2; }
    )();
    

    是一种奇特的写作方式

    var f = (function g(){ return 2; })();
    

    这是一种奇特的写作方式

    var f = 2;
    

    2 是一个数字。

    【讨论】:

      【解决方案3】:

      这里的 f 不是函数。

      而是包含g函数返回的值。

      f 当前持有 IIFE 中返回的值

      var f = (
        function f(){ return "1"; }, 
        function g(){ return 2; }
      )();
      
      console.log(f);
      
      </script>

      【讨论】:

        【解决方案4】:

        所以,对,逗号运算符。但更重要的是函数上下文的变化。它们不再可从全局范围访问。

        Does the comma operator influence the execution context in Javascript?的这个答案中可能有一些扩展:

        var f = (
                function f() { return "1"; }, 
                function g() { return 2; }
            )();
        
        console.log(f);
        console.log(typeof f);
        console.log(g()); // throws error: 'g' is not defined

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2021-03-24
          • 2021-08-15
          • 1970-01-01
          • 2011-12-01
          • 1970-01-01
          • 2020-02-07
          • 2016-10-28
          • 1970-01-01
          相关资源
          最近更新 更多