4

和 IIFE 有什么区别吗

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

和一个简单的功能

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

与我有关的警告是,如果我没有从 IIFE 或函数中传递任何内容,IIFE 是否会使记忆保持更长时间?

4

1 回答 1

6

相反,尽管这可能不是一个严重的问题。

两者在语法上并不相同。第二个声明一个函数并将其绑定到本地符号“foo”。该函数将在函数调用后保留。

IIFE 形式在语法上是一个单一的表达式语句。第二种形式涉及两个语句,一个函数声明语句和一个表达式语句(函数调用)。

函数调用处理局部变量声明的方式与函数对象如何产生无关。如果您的示例中的两个函数相同,那么在函数调用中为局部变量分配空间的方式没有区别。

编辑——关键的语法区别在于:新语句开头function的关键字引入了函数声明语句。该句法形式不提供立即调用。也就是说,这个:

function hello() {
  // some code
}();  // <---- ERROR

是语法错误。

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

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

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

于 2013-03-28T17:33:13.797 回答