在最基本的函数调用中,我们把求值得到函数的标识符作为左值(如下图所示)。不过用于被括号调用的表达式不必只是一个简单的标识符,它可以是任何能够求值得到函数的表达式。例如,指定一个求值得到函数的表达式的最简单方式是使用函数表达式。如下图中右图所示,我们首先创建了一个函数,然后立即调用这个新创建的函数。这种函数叫作立即调用函数表达式(IIFE),或者简写为立即函数。
这种函数的叫法很多,理解其意即可,学其神,用其形。
上图也可以看成是
const myFunctionName = function(){}
myFunctionName(3)
就相当于
(function(){})(3)
其实就是将函数调用的标识符替换为了函数表达式。
而表达式之所以加小括号,是因为JavaScript 解析器必须能够轻易区分函数声明和函数表达式之间的区别。去掉括号,解析器便会认为这是一个函数声明,而不是表达式,因为函数声明必须有一个名称,而此处没有,所以解析到function关键字之后便会报错;为了避免错误,才添加小括号,为JavaScript解析器指明这是函数表达式,而不是函数声明语句。
立即执行函数的其他调用方式:
(function(){}()); // 不常用,写法比较奇怪,难理解
+function(){}();
-function(){}();
!function(){}();
~function(){}();
不同于用加括号的方式区分函数表达式和函数声明,这里我们使用一元操作符+、-、!
和 ~
。这种做法也是用于向 JavaScript 引擎指明它处理的是表达式,而不是语句。
作用:
立即执行函数可以创建一个独立的作用域,防止变量污染;封装库的时候使用颇多,如jQuery。