命名的IIFE和立即调用命名函数之间有什么区别?

4

立即执行函数(IIFE)和普通函数的区别是什么?

(function foo () {
    var var_of_concern;
}());

以及一个普通函数

function foo () {
   var var_of_concern;
}
foo();

我的担忧是,如果我既没有从IIFE,也没有从函数中传出任何东西,那么IIFE会使内存保持更长时间的活性吗?

1个回答

6
相反,虽然这可能不是一个严重的问题。
这两者在语法上并不相同。第二个声明了一个函数并将其绑定到本地符号"foo"。该函数将在函数调用后保留。
IIFE形式在语法上是单个表达式语句。第二种形式涉及两个语句,一个函数声明语句和一个表达式语句(函数调用)。
函数调用处理局部变量声明的方式与函数对象的产生方式无关。如果您示例中的两个函数是相同的,则在函数调用中分配局部变量的空间没有区别。
编辑-关键的语法差异在于:在新语句的开头使用关键字“function”引入函数声明语句。该语法形式不提供立即调用。也就是说,这个:
function hello() {
  // some code
}();  // <---- ERROR

是语法错误。

function关键字出现在其他上下文中时(也就是任何有效的上下文),它不是函数声明,而是函数实例化(或函数定义;我得查一下规范)表达式。在JavaScript中,这些都可以作为表达式的一部分:

 5
 "hello"
 false
 (2 + 5)
 (function() { alert("Hi!"); })

请注意,最后一个示例涉及括号 - 这通常是为了"缓解"解析器的"哦,看到函数声明了!"行为而使用的。那个左括号意味着function关键字不是出现在语句的绝对开头,因此它只是一个函数实例化表达式。

如果IIFE被命名为foo,那么它们在语法上是相同的吗?抱歉,在获得这个信息之前我无法提出更精确的问题...这是最后的澄清/编辑...抱歉。 - user656925
@Pointy 我会说这很相似:var a = function foo() {}; - foo 不是一个可以从此以后引用的函数...你通过 a 引用它。 - Ian
我不明白为什么IIFE不是编写模块化代码的默认方式,因为它似乎并不需要更多的资源。 - user656925
@livingston_mechanical 嗯,在 JavaScript 世界中,“实际上”的使用方法可能每小时都在变化 :-) 它确实是一个非常常见的结构,也是一个极其有用的结构。 - Pointy
@Pointy 哦,我知道,我只是想指出来。这次讨论让我想起了它 :) 我永远不会那样做或建议那样做,只是想到了它! - Ian
显示剩余4条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接