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

时间:2013-03-28 17:31:40

标签: javascript

和IIFE之间有什么区别

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

和普通功能

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

关注我的警告是,如果我从IIFE或功能中没有通过任何内容,那么IIFE会让内存保持更长时间吗?

1 个答案:

答案 0 :(得分:6)

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

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

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

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

编辑 - 键语法的区别在于:新语句的 start 处的关键字function引入了一个函数声明。该语法形式不提供立即调用。就是这样:

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

是语法错误。

function关键字出现在任何其他上下文(以及任何有效的上下文)中时,它是不是一个函数声明 - 它是一个函数实例化(或函数定义;我是必须检查spec)表达式。这些都是JavaScript中表达式的一部分:

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

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