立即执行函数的认知

我们所说的立即执行函数英文是: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')
})()
复制代码
  • 特点
  1. 可以创建一个与外界没有任何关联的作用域(独立作用域)
  2. 执行完成以后自动销毁
  3. 向外部抛出一系列属性和方法

资料来源:哔哩哔哩

© 版权声明
THE END
喜欢就支持一下吧
点赞0 分享