【问题标题】:Closure example what part does self invoking do闭包示例自我调用的作用是什么
【发布时间】:2018-03-13 09:25:17
【问题描述】:

我提出了 2 个关闭的例子。第一个工作正常,而第二个不行。现在,我不明白为什么第二种情况会失败。它仍然调用匿名函数 3 次,并且必须也给出相同的关闭结果。

示例 1:(工作正常)

<html> 
<head></head>
<body>
<script>

var alpha1 = (function alpha(){
var a = 5; 
function beta(){
    a = a + 5; 
    alert(a);
    return a;
} 
return beta; 
})();
alpha1();
alpha1();
alpha1();
</script>

</body>
</html> 

示例 2:(不起作用且没有错误)

<html> 
<head></head>
<body>
<script>

var alpha1 = function alpha(){
var a = 5; 
function beta(){
    a = a + 5; 
    alert(a);
    return a;
} 
return beta; 
};
alpha1();
alpha1();
alpha1();
</script>

</body>
</html> 

现在,在第二个示例中,我仍然调用函数 alpha1 3 次;虽然我没有将它作为 IIFE 启动(在第一个示例中),但我仍然手动调用它,它必须作为闭包工作。不应该吗?

【问题讨论】:

    标签: javascript function scope closures


    【解决方案1】:

    现在,在第二个示例中,我仍在调用函数 alpha1 3 次;

    第一个和第二个的区别是 - 第一个 alpha1 是函数 alpha 的返回值的句柄 (beta)。每次调用alpha1();,它都会调用相同的beta

    第二个alpha1 是函数alpha1 本身的句柄。每次调用alpha1();,它都会返回新的beta

    【讨论】:

      【解决方案2】:

      在您的第一个示例中,IIFE 将函数返回到 alpha1 变量,因此当您调用 alpha1 时它可以工作

      <html> 
      <head></head>
      <body>
      <script>
      
      var alpha1 = function (){
      var a = 5; 
      function beta(){
          a = a + 5; 
          alert(a);
          return a;
      } 
      return beta; 
      };
      const resp = alpha1();
      resp()
      resp()
      resp()
      </script>
      
      </body>
      </html>

      【讨论】:

      • 仍然没有关闭。值为 10、10、10。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-01-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多