使用参数“稍后”调用IIFE

时间:2016-01-10 01:55:03

标签: javascript invoke iife

我的代码中有一个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后创建)做一些事情? 目前我收到的错误如下:未捕获的ReferenceError:未定义param1

2 个答案:

答案 0 :(得分:3)

您的代码编写方式,您无法访问firstIIFE()之外的start(),因为它是一个内部函数。为了以后访问它,您需要通过将外部变量设置为该函数,或者将其移到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(),因为它不再遵循立即调用的函数表达式模式,而是现在只是正常模式函数调用)。

答案 1 :(得分:1)

函数表达式的名称不能被创建它们的作用域访问,因此不能从该作用域调用,而不在变量中存储对函数的引用。
但是将函数存储在变量中而不是声明它们会产生副作用,即不将函数提升到当前作用域的顶部,这是您很少需要的。

你可以这样做:

(foo = function myNameIsKnownOnlyToMyself() {
     ...
 })();

foo(); // again!

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