和 IIFE 有什么区别吗
(function foo () {
var var_of_concern;
}());
和一个简单的功能
function foo () {
var var_of_concern;
}
foo();
与我有关的警告是,如果我没有从 IIFE 或函数中传递任何内容,IIFE 是否会使记忆保持更长时间?
和 IIFE 有什么区别吗
(function foo () {
var var_of_concern;
}());
和一个简单的功能
function foo () {
var var_of_concern;
}
foo();
与我有关的警告是,如果我没有从 IIFE 或函数中传递任何内容,IIFE 是否会使记忆保持更长时间?
相反,尽管这可能不是一个严重的问题。
两者在语法上并不相同。第二个声明一个函数并将其绑定到本地符号“foo”。该函数将在函数调用后保留。
IIFE 形式在语法上是一个单一的表达式语句。第二种形式涉及两个语句,一个函数声明语句和一个表达式语句(函数调用)。
函数调用处理局部变量声明的方式与函数对象如何产生无关。如果您的示例中的两个函数相同,那么在函数调用中为局部变量分配空间的方式没有区别。
编辑——关键的语法区别在于:新语句开头function
的关键字引入了函数声明语句。该句法形式不提供立即调用。也就是说,这个:
function hello() {
// some code
}(); // <---- ERROR
是语法错误。
当function
关键字出现在任何其他上下文(嗯,任何有效的上下文)中时,它就不是函数声明——它是函数实例化(或函数定义;我必须检查规范)表达式。这些都是可以成为 JavaScript 表达式的一部分的东西:
5
"hello"
false
(2 + 5)
(function() { alert("Hi!"); })
请注意,最后一个示例涉及括号 - 这通常用于“化解”“哦,看看函数声明!” 解析器的行为。左括号意味着function
关键字不会出现在语句的绝对开头,因此它只是一个函数实例化表达式。