【问题标题】:Invoke IIFE "later" with parameters使用参数“稍后”调用 IIFE
【发布时间】:2016-01-10 01:55:02
【问题描述】:

我的代码中有一个 IIFE,而其他 IIFE 很少。他们都有名字(所以他们不是匿名的)。我想稍后通过其他函数调用一些 IIFE(我的意思是,是的,它们一开始就完成了他们的工作,但我想稍后使用它们)。例如:

(function start()
{
  /* some code*/

  (function firstIIFE(param1, param2)
  {
    if (param1 && param2)
    {
       console.log('param1 ',param1, 'param2 ',param2);
       return;
    }
    /* some code done when IIFE originally was self-invoked */
  }(param1, param2));

  /* some code */
}());

function foo()
{
   start.firstIIFE(param1, param2);
}

以后可以调用 (firstIIFE) IIFE 吗?因为我希望这个函数用param1param2(我在调用那些IIFE 之后创建)做一些事情? 目前我收到如下错误:Uncaught ReferenceError: param1 is not defined

【问题讨论】:

  • IIFE=> 立即调用函数表达式 为什么要它们稍后执行?
  • 因为他们做了一些事情,我想用我的新参数(在 IIFE 完成它的工作后创建)来完成。
  • 您可以拥有一个可以保存函数表达式的变量,并且您可以在任何您希望进行常见操作的地方使用该变量..
  • 答案就是这么简单,停止使用立即调用的函数模式,使用命名函数,你可以随时调用它们,想调用多少次就行。

标签: javascript invoke iife


【解决方案1】:

按照您的代码编写方式,您将无法在start() 之外访问firstIIFE(),因为它是一个内部函数。为了稍后访问它,您需要以某种方式公开它,方法是为该函数设置一个外部变量,或者将其移出start() 并让start() 只调用该函数,而不是定义它并然后立即执行它:

function firstIIFE(param1, param2) {
  if (param1 && param2) {
     console.log('param1 ',param1, 'param2 ',param2);
     return;
  }
  /* some code done when IIFE originally was self-invoked */
}

(function start() {
  /* some code*/

  firstIIFE(param1, param2);

  /* some code */
}());

function foo() {
   firstIIFE(param1, param2);
}

(此时您可能不需要将其称为firstIIFE(),因为它不再遵循立即调用函数表达式模式,而是现在只是一个普通的函数调用)。

【讨论】:

    【解决方案2】:

    函数表达式的名称在创建它们的范围内是不可访问的,因此如果不将函数的引用存储在变量中,就无法从该范围调用。
    但是将你的函数存储在变量中而不是声明它们的副作用是不会将你的函数提升到当前范围的顶部,这是你很少想要的。

    你可以这样做:

    (foo = function myNameIsKnownOnlyToMyself() {
         ...
     })();
    
    foo(); // again!
    

    如果您真的喜欢您的 IIFE 模式,但正如其他人所说,这可能不是解决您问题的最优雅的解决方案。

    【讨论】:

    • 为什么foo 在这个例子中是全局的?
    • @Chris92 因为在 JavaScript 中,当您使用变量名而没有事先在当前作用域中声明它时,JavaScript 会在外部作用域中查找它,直到它最终在全局作用域中结束,在这种情况下它将检查它作为所述全局对象的属性。正如你可以猜到的那样,这种行为很容易出错,所以当前版本的 JS 允许你通过在函数中或全局使用 Strict mode 来停用它。
    • 好的,对。但是拥有(var foo = function(){}()); 是错误的 IIFE?
    • 是的,你不能这样做,因为 JavaScript 在 statementexpression 之间做出了unfortunate 的区别。语句只能“在自己的行”,而表达式可以在任何地方使用。变量声明只能是语句。
    • 这是有效的(你甚至可以省略外括号),但foo 将存储函数返回的任何内容,而不是函数本身,除非你通过命名使其返回自身:var foo = function imFoo() { return imFoo; }();
    猜你喜欢
    • 2017-10-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-07-09
    • 1970-01-01
    相关资源
    最近更新 更多