- 前言
- 关于 ECMASCRIPT 发展史和现状
- ES6 带来的重大特性
- ES2016(ES7)的改进
- ES2017(ES8)带来的重大新特性
- ES2018(ES9)带来的重大新特性
- JavaScript 编码风格指南
- JavaScript 词法结构(构建块)
- JavaScript 变量
- JavaScript 数据类型
- JavaScript 表达式
- 原型继承
- 如何使用 JavaScript 中的 Classes(类)
- JavaScript 异常处理
- JavaScript 中的分号(;)
- JavaScript 中的引号
- JavaScript 字面量模板(Template Literals)指南
- JavaScript 中的 function(函数)
- JavaScript 箭头函数(Arrow Function)
- JavaScript 中的闭包(Closures)
- JavaScript 数组(Arrays)
- JavaScript 中的循环(Loops)
- JavaScript 中的事件(Events)
- JavaScript 中的事件循环(Event Loop)
- JavaScript 异步编程和回调
- 理解 JavaScript 中的 Promises
- 用 async 和 await 编写现代 JavaScript 异步代码
- JavaScript 中的 循环(Loops) 和 作用域(Scope)
- JavaScript 定时器 setTimeout() 和 setInterval()
- JavaScript 中的 this
- JavaScript 严格模式(Strict Mode)
- JavaScript 中的 立即执行函数表达式(IIFE)
- JavaScript 中的数学运算符
- JavaScript 中的 Math 对象
- 介绍 ES Modules(模块)
- 介绍 CommonJS
- JavaScript 术语表
文章来源于网络收集而来,版权归原创者所有,如有侵权请及时联系!
JavaScript 中的 立即执行函数表达式(IIFE)
立即执行函数表达式(IIFE) 是在创建函数后立即执行函数的方法。
立即执行函数表达式(IIFE) 非常有用,因为它们不会污染全局对象,它们是隔离变量声明的简单方法。
这是定义 IIFE 的语法:
;(function() { /* */ })()
立即执行函数也可以使用箭头函数定义:
;(() => { /* */ })()
基本上,我们在括号内定义了一个函数,然后在后面加上一个括号 ()
来执行该函数: (/* function */)()
。
包裹函数的括号实际上是使我们的函数在内部被视为表达式。 否则,函数声明将无效,因为我们没有指定任何名称:
函数声明需要一个名称,而函数表达式不需要它。
你也可以将调用括号放在表达式括号内,没有区别,只是写法不同:
(function() { /* */ }()) (() => { /* */ }())
使用一元运算符的替代语法
你可以使用一些更奇怪的语法来创建 IIFE ,但它在现实世界中很少使用,并且它依赖于使用任何一元运算符:
;-(function() { /* */ })() +(function() { /* */ })() ~(function() { /* */ })() !(function() { /* */ })()
但是这种方式不适用于箭头函数。
命名的 IIFE
IIFE 也可以是命名的常规函数(不是箭头函数)。 这不会导致函数“泄漏”到全局作用域,并且在执行后也不能再次调用它:
;(function doSomething() { /* */ })()
IIFE 前的分号
你可能已经注意到 IIFE 前的分号了:
;(function() { /* */ })()
这可以防止在盲目合并两个 JavaScript 文件时出现问题。 由于 JavaScript 不需要分号,因此你可能会在最后一行中使用某些语句连接一个文件,从而导致语法错误。
这个问题基本上是通过像 webpack 这样的“智能”打包工具来解决的。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论