JS 自执行闭包:当内部的 IIFE 有冲突的声明时会发生什么?
JS self-executing closure: what happens when IIFEs inside have conflicting declarations?
我正在研究 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 开发人员控制台的代码,并在代码中到达了 IIFE 内的 PI 值得到 "overwritten" 到 3.14 的点,尽管如此之前限制为 100。
第二个问题:
里面的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 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 开发人员控制台的代码,并在代码中到达了 IIFE 内的 PI 值得到 "overwritten" 到 3.14 的点,尽管如此之前限制为 100。
第二个问题:
里面的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`
请随时提出更多关于此的问题,使用名称和参考文献,以便我在同一页面上。