为什么IIFE中的多个函数执行最后一个函数?

时间:2019-02-26 09:16:52

标签: javascript html function

我实际上不知道这段代码的输出是数字。有人可以帮助您理解此示例中JS运行的逻辑是什么?

<script>

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

console.log(typeof f);

</script>

4 个答案:

答案 0 :(得分:4)

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

  

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

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

类似于:

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

答案 1 :(得分: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是一个数字。

答案 2 :(得分:1)

f不是函数。

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

f当前保持在IIFE中返回的值

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

console.log(f);

</script>

答案 3 :(得分:1)

所以,对,逗号运算符。但是更重要的是功能上下文的改变。无法再从全局范围访问它们。

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