我们所说的立即执行函数英文是:immediately-invoked function expression,缩写:IIFE
翻译意思就是立即调用的函数表达式
为什么是函数表达式呢?
首先要知道函数声明和函数表达式的区别 (函数声明 != 函数表达式)
//这个叫函数声明
function test1() {
console.log('test1')
}
//我们把一个函数声明式赋值给一个变量的形式,这叫函数表达式(这里是一个匿名函数,当然函数有名字也可以)
let a = function () {
console.log('hello')
}
复制代码
然后我们在函数名称、变量名称后面加上括号就可以来调用它们,对于函数名后面的括号,我们叫执行符号
test1() //test1
test2() //hello
复制代码
到这里再返过去看立即调用的函数表达式这个词。
我们在函数声明时后面就加上()执行符号,是不是就可以立即调用了。
function test1() {
console.log('test1')
}() //报错,语法错误
let test2 = function () {
console.log('hello')
}() //输出 hello
复制代码
通过上面代码可以了解到,执行符号直接跟在函数声明后面会报错,而跟在函数表达式后面可以立即执行
这样我们就可以明白。当一个函数需要立即执行的情况,该函数必须形成表达式形式
我们在函数声明前面加上“+”、“!”、“~”,和用括号括起来等等,都可以将函数声明形成表达式
+function test1() {
console.log('test1')
}()
!function test2() {
console.log('test2')
}()
~function test3() {
console.log('test3')
}()
;(function test4() {
console.log('test4')
})()
let test5 = function () {
console.log('test5')
}()
复制代码
W3C推荐的立即执行函数规范是用括号将函数声明和执行符号包起来
(function() {}())
复制代码
实践中我们一般将执行符号放在外面,这样看起来更清晰
(在前面加上分号是为了避免代码编译错误。很多时候我们写js代码都是不写分号的,而js引擎在解析代码时会自动加上,但是像下面代码,括号多了,它也分辨不出哪个跟哪个是一组,所以需要手动加上分号。由于很多开发者语句后面不打分号,为了避免,就约定俗成的在立即执行函数前面加上分号)
;(function() {
console.log('test4')
})()
复制代码
- 特点
- 可以创建一个与外界没有任何关联的作用域(独立作用域)
- 执行完成以后自动销毁
- 向外部抛出一系列属性和方法
资料来源:哔哩哔哩
© 版权声明
文章版权归作者所有,未经允许请勿转载。
THE END