【发布时间】:2020-02-08 09:58:56
【问题描述】:
考虑以下几点:
https://developer.mozilla.org/en-US/docs/Glossary/IIFE
(function() {}());
然后就是这个sn-p:
class Test {
constructor() {
this.WP = (() => { //scope here?
// annotated
const tar = webpackJsonp.push([[], {a_test: (md, exp, tar) => md.exports = tar}, [["a_test"]]]);
delete tar.m.a_test;
delete tar.c.a_test;
// annotated_end
const find = (mask) => {
for (let i in tar.c) {
if (tar.c.hasOwnProperty(i)) {
let m = tar.c[i].exports;
if (m && m.__esModule && m.default && mask(m.default)) return m.default;
if (m && mask(m)) return m;
}
}
return null;
};
return {find};
})();
}
}
这是
= (() => {})();
我的理解他们都是IIFE,我不明白的是:
- 为什么在语法上有这样的差异?我不是在谈论箭头部分,我知道箭头功能。我说的是括号,有一些范围废话。
- 为什么注释部分只执行一次?
const tar是作用域的,这是一个函数,每次我调用它时,都应该恢复作用域。然而调用find会重用已经存在的const变量。什么给了?
老实说,我完全是神秘的,只是偶然发现了
【问题讨论】:
-
你能举个例子吗?
-
“为什么在语法上有这样的差异”?语言规范需要括号。 “为什么注释部分只执行一次?”因为它属于立即执行的部分,而不属于IIFE返回作为函数的部分。
-
Kirikan,我真的不明白你在问什么。此外,说
tar是作用域并不能说明很多:JavaScript 中的所有 变量都有一个作用域。最后,一个好问题,应该只是......一个问题。 -
Kirikan,你明白 IIFE 只执行一次吗(当然,除非你多次执行周围的代码)?但是 IFFE 返回的函数可能会在以后多次调用?并且这样的返回函数可以访问其范围内的变量(closure的原则)?我不确定是什么让您感到困惑。有很多方面...
-
问题是你这里有太多关于语法、范围和语义的问题,而且你包含的 sn-p 执行了毫无意义的操作,这使得问题更加难以回答。请只关注一个方面,得到有用答案的机会会大大增加。
标签: javascript