我的代码中有一个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吗?因为我希望这个函数用param1
和param2
(我在调用这些IIFE后创建)做一些事情?
目前我收到的错误如下:未捕获的ReferenceError:未定义param1
答案 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模式,但正如其他人所说,这可能不是解决您问题的最佳解决方案。