概念:
立即执行函数没有函数声明,在一次执行过后即释放,适合做初始化工作。
形式:
(function() {
// code
}());
由来:
据说立即执行函数并不是标准里专门定义的有这样一个语法来写这样一个函数,而是程序员们根据需求自己鼓捣出来的。
理解立即执行函数之前先要了解两个概念:
- 只有表达式才能被执行符号
()
执行; - 能被执行符号执行的表达式,这个函数的名字就会被自动忽略。
例子:
正常情况下,定义一个函数
function test() {
console.log(123);
}
打印这个函数
console.log(test);
// ƒ test() {
// console.log(123);
// }
执行这个函数
test(); // 123
立即执行函数
function test() {
console.log(123);
}();
// 报错 Uncaught SyntaxError: Unexpected token )
那这样呢
function test() {
console.log(123);
}(1, 2, 3);
// 不会报错,但是也不会输出任何结果
我们可以在编辑器里只输入:(); // 这里会报错
再只输入:(1, 2, 3); // 这里不会
所以第二段代码浏览器是这样理解的:
function test() {
console.log(123);
}
(1, 2, 3);
上面我们说过:1. 只有表达式才能被执行符号( ‘()’ )执行;
神奇的一刻(正号)
+function test() {
console.log(123);
}(); // 123
负号也可以
-function test() {
console.log(123);
}(); // 123
非也可以
!function test() {
console.log(123);
}(); // 123
括号也可以
(function test() {
console.log(123);
})(); // 123
(function test() {
console.log(123);
}()); // 123
以上代码执行完成后再打印函数
console.log(test); // Uncaught ReferenceError: test is not defined
这就是上面说的第二点:2. 能被执行符号执行的表达式,这个函数的名字就会被自动忽略。
因为执行一次就被释放了,所以写不写名字意义不大。最后就变成了下面这样:
(function() {
// code
}());