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返回的函数以后可能会被多次调用吗?这种返回函数可以访问其范围内的变量(闭包原则)?我不知道是什么让你困惑。这里有很多方面……问题是,这里有太多关于语法、范围和语义的问题,而且您包含的代码片段执行的操作毫无意义,这使得问题更加无法回答。请只关注一个方面,得到有用答案的机会将大大增加。