Javascript iLife的行为是否因语法而异?
考虑以下几点:Javascript iLife的行为是否因语法而异?,javascript,Javascript,考虑以下几点: 然后是这个片段: class Test { constructor() { this.WP = (() => { //scope here? // annotated const tar = webpackJsonp.push([[], {a_test: (md, exp, tar) => md.exports = tar}, [["a_test"]]]); delete
然后是这个片段:
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};
})();
}
}
那是
= (() => {})();
我的理解是他们都是生命,我不理解的是:
const tar
是作用域,这是一个函数,每次我调用它时,都应该恢复作用域。然而调用find
会重用已经存在的const
变量。有什么好处老实说,我完全搞不懂非箭头函数表达式,调用IIFE的括号可以放在描述函数表达式的括号之前或之后
(function (){}()) or (function f(){})()
(() => {})()
对于arrow函数表达式,调用IIFE的括号只能放在描述函数表达式的括号之后
(function (){}()) or (function f(){})()
(() => {})()
对此原因进行了讨论
不管怎样,行为都是一样的。你能举一个runnabe的例子吗?“为什么语法上有这么大的差异?”?语言规范需要括号。“为什么带注释的部分只执行一次?”因为它属于立即执行的部分,而不是IIFE作为函数返回的部分。Kirikan,我真的不明白你在问什么。此外,说
tar
是作用域并不能说明什么:JavaScript中的所有变量都有一个作用域。最后,一个好问题,应该是。。。一个问题,Kirikan,你明白IIFE只执行一次吗(当然,除非你多次执行周围的代码)?但是IFFE返回的函数以后可能会被多次调用吗?这种返回函数可以访问其范围内的变量(闭包原则)?我不知道是什么让你困惑。这里有很多方面……问题是,这里有太多关于语法、范围和语义的问题,而且您包含的代码片段执行的操作毫无意义,这使得问题更加无法回答。请只关注一个方面,得到有用答案的机会将大大增加。