我正在通过JavaScript allonge#six并进入以下示例(每行代码后的简短注释):

((PI) => {             //1 - Outer - PI = 3.14
   ((PI) => {})(100);   // 2 - IIFE (LOCAL)  PI = 100


  // ((PI) => PI)(100) // alternative1 = LOCAL PI = 100
 //  ((PI) => {return PI;})(100) // alternative2 - LOCAL PI = 100

  return (diameter) => diameter * PI;  // 3 - PI = 3.14
})(3.14)(2)


在所有这些情况下,外部函数中以PI为边界的参数将直接传递给return语句,从而忽略IIFE。可以遮盖“ PI”参数的唯一方法是将return语句更改为此:

((PI) => (diameter) => diameter * PI)(100)


那么第一个问题:在这种情况下,除了闭包之外,还有没有其他方法可以隐藏PI参数(外部函数上的绑定参数)?

此外,我逐行通过Google Developer Console运行代码,并到达代码中的一个点,尽管先前限制为100,但IIFE中的PI值仍被“覆盖”为3.14。

第二问:

IIFE内部执行后会发生什么情况,什么时候将其PI值覆盖为3.14?

最佳答案

我发现很难弄清楚你到底在问什么。因此,我只是重新组织了代码,并添加了自己的注释,以使自己更清楚一些,并希望回答您的部分问题。

var a = (function a(PI) {
   // In this scope, PI = 3.14

   (function b(PI) {
     // PI = 100
   })(100);

  return function c(diameter) {
    // PI = 3.14, still in scope `a`
    // diameter = 2, passed in from second call
    return diameter * PI;
  };
});

a_result = a(3.14); // == c, with PI = 3.14
c_result = a_result(2); // c called with diameter = 2, PI = 3.14 from scope `a`


随意使用名称和引用来询问有关此的更多问题,所以我在同一页面上。

关于javascript - JS自执行闭包:当内部的IIFE具有冲突的声明时会发生什么?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/38817729/

10-10 22:07