立即执行函数
1. 立即执行函数的定义和形式
定义:此类函数没有声明,在一次执行后立即释放。适合做初始化工作,适合在整个代码中只执行一次的函数(初始化功能函数)。
普通函数在未执行时会占用内存空间,为了减少不必要的空间占据,可以对只执行一次的函数使用立即执行函数的方式来编写。
对应红宝书中的立即调用的匿名函数(IIFE立即调用的函数表达式)
立即执行函数的形式:
(function() {
} ())
第一组小括号放形参,第二组小括号放实参。
立即执行函数与普通函数在功能上,只有作用后销不销毁(释不释放)的区别。因此立即执行函数可以有形参实参、返回值、执行期上下文,并且也需要经历预编译。
(function (a, b, c) {
console.log(a + b - 3 * c);
} (1, 2, 3))
var num = (function (a, b, c){
var d = a + b + c * 2 - 2;
return d;
} (1, 2, 3))
2. 立即执行函数的两种写法
(function () {} ())
以及(function () {}) ()
。
W3C建议第一种。
注意:
-
只有表达式才能被执行符号执行。
()
即为执行符号; -
能被执行符号执行的函数表达式,这个函数的名字就会被忽略。
例1:
function test() {
var a = 1234;
}();
上述程序的执行符号()
前并不是表达式,而是函数声明。所以这种情况会报错。
function test() {
var a = 1234;
}
test(); //test是表达式
1234; //1234也是表达式
例2:
var num = function () {
console.log('a');
} ();
上述程序执行符号之前是函数表达式,因此是可以立即执行的。但被执行后,num不再是函数。
例3:
+ function test() {
console.log("a");
}();
在函数声明前加正负号、逻辑运算符等会将此句转化为表达式,可以被执行符号执行。表达式执行后,表达式名test会失效。
同样( )
也会将括号内的语句转化为表达式。因此(function a() {})
就转化为了表达式,(function a() {})();
就能被执行,这就是立即执行函数的由来。
同样对于(function a() {} ());
而言,会先看最外层的小括号,此时会将其内部的内容转化为表达式,同样将函数声明变成了可执行的表达式。又由于能被执行的表达式会被忽略其名字,因此可将函数名省略,可简写为(function () {} ())
。
特殊的
function test(a, b, c, d) {
console.log(a + b + c + d);
}(1, 2, 3, 4);
这样并不会报错,但是函数也不会执行。这样写就相当于
function test(a, b, c, d) {
console.log(a + b + c + d);
}
(1, 2, 3, 4);
系统会将其看作两个语句,一个是函数声明,一个是(1, 2, 3, 4)
语句。