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

标签 javascript

和IIFE有区别吗

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

和一个简单的函数

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

让我担心的是,如果我没有从 IIFE 或函数中传递任何内容,IIFE 是否会让内存保持更长时间?

最佳答案

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

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

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

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

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

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

是语法错误。

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

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

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

关于javascript - 命名 IIFE 和立即调用名称函数之间的区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15688420/

相关文章:

javascript - 使用 ref react Canvas ,省略调用 ref.current 和 ctx?

javascript - 我可以在 Adob​​e Animate CC 中使用哪个 ECMAScript 版本

javascript - 隐藏模态并使用 CSS3 转换显示它

javascript - 桑基 : Show dynamically text on x-axis

javascript - leaflet.draw 垃圾按钮删除所有多边形并保存

javascript - 使用 TypeScript 强制 React 组件命名

javascript - Mozilla Firefox Javascript 中的换行符

javascript - 如何使用 .includes 按多个值进行过滤?

javascript - 文件输入不会更新(Chrome 除外)

javascript - 如何知道 Google Docs Viewer 中的总页数