【问题标题】:Does IIFE behaves differently depending on syntax? [closed]IIFE 的行为是否因语法而异? [关闭]
【发布时间】: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,我不明白的是

  1. 为什么在语法上有这样的差异?我不是在谈论箭头部分,我知道箭头功能。我说的是括号,有一些范围废话。
  2. 为什么注释部分只执行一次? const tar 是作用域的,这是一个函数,每次我调用它时,都应该恢复作用域。然而调用find 会重用已经存在的const 变量。什么给了?

老实说,我完全是神秘的,只是偶然发现了

【问题讨论】:

  • 你能举个例子吗?
  • “为什么在语法上有这样的差异”?语言规范需要括号。 “为什么注释部分只执行一次?”因为它属于立即执行的部分,而不属于IIFE返回作为函数的部分。
  • Kirikan,我真的不明白你在问什么。此外,说tar 是作用域并不能说明很多:JavaScript 中的所有 变量都有一个作用域。最后,一个好问题,应该只是......一个问题。
  • Kirikan,你明白 IIFE 只执行一次吗(当然,除非你多次执行周围的代码)?但是 IFFE 返回的函数可能会在以后多次调用?并且这样的返回函数可以访问其范围内的变量(closure的原则)?我不确定是什么让您感到困惑。有很多方面...
  • 问题是你这里有太多关于语法、范围和语义的问题,而且你包含的 sn-p 执行了毫无意义的操作,这使得问题更加难以回答。请只关注一个方面,得到有用答案的机会会大大增加。

标签: javascript


【解决方案1】:

对于非箭头函数表达式,调用 IIFE 的括号可以位于描述函数表达式的括号之前或之后。

(function (){}()) or (function f(){})()

对于箭头函数表达式,调用 IIFE 的括号只能放在描述函数表达式的括号之后。

(() => {})()

原因在here讨论。

不管怎样,行为都是一样的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-01-29
    • 2011-07-16
    • 2022-11-25
    • 2015-04-26
    • 1970-01-01
    相关资源
    最近更新 更多