关于立即执行函数(IIFE)的理解

434 阅读1分钟

JS中创建函数有两种办法:

  1. 函数声明
  2. 函数表达式 函数声明和变量声明存在变量提升,也就是说,v8引擎会在编译阶段将函数的声明和变量的提升到作用于的上部。
    函数表达式fun1和函数声明fun2
var fun1 = function () {}
function fun2(){
    // ...
}

相当于在编译阶段进行如下声明

var fun1 = undefined
function fun2(){
    // ...
}

然后在执行阶段对fun1进行赋值

fun1 = function () {}

IIFE就是利用了表达式在执行阶段进行赋值的原理。
在V8中,表达式是有返回值的,比如 a=3 这个表达式返回的就是3。
小括号中写入的会被认为是表达式,比如,(a=3)相当于a=3,如果小括号中放入一个函数声明,也会被认为是一个表达式,而不是一个函数声明。已知表达式是在执行阶段才能知道里面的内容的,所以小括号中写入函数不会出现函数提升,效果相当于函数表达式。

(function() {console.log(1)}) // ƒ () {console.log(1)}

返回的是function() {console.log(1)},然后再在其后面加一个小括号表示执行,函数就会在执行阶段被直接执行。这就是立即执行函数。

(function() {console.log(1)})() // 1

在ES6之前,JavaScript没有块作用域的概念,IIFE的作用就是让函数以及函数内部的变量不会被外部感知,从而在多人开发的环境中,避免相互之间变量污染。