JavaScript快速调用函数IIFE
IIFE是JavaScript中一种定义后就会快速调用的写法,也被称为自执行匿名函数、立即执行函数
# 立即执行函数的定义
// 标准 IIFE
(function () {
// 语句……
})();
1
2
3
4
2
3
4
通常,函数的声明有这两种
function fnA(){
alert("msg");
}//声明式定义函数
var fnB = function(){
alert("msg");
}//函数赋值表达式定义函数
1
2
3
4
5
6
2
3
4
5
6
如果尝试为一个定义函数末尾加上(),解析器是无法理解的
function msg(){
alert("msg");
}();//解析器无法理解
1
2
3
2
3
定义函数的调用方式应该是msg(),为什么将函数体部分用()包裹起来就可以执行了呢?
原来,使用括号包括定义函数体,解析器将会以函数表达式的方式去调用定义函数,也就是说,任何能将函数标称一个函数表达式的作法,都可以使得解析器正确的调用定义函数,而 ! 就是其中的一种,而 + - || &&都有这样的功能。
另外,用 ! 可能更多的是一个习惯问题,不同的运算符,性能是不同的。
推荐阅读function与感叹号 (swordair.com) (opens new window)
javascript里function之前加上感叹号 ' ! ' 会怎么样? - SegmentFault 思否 (opens new window)
# 立即执行函数的用途
创建一个独立的作用域,这个作用域里面的变量,外部访问不到,避免变量污染,能形成一个 块级作用域 效果
(function () {
// 块级作用域
})();
1
2
3
2
3
这在没有块级作用域的 ES3 时代,是普遍的做法(PS:在 ES5 只有全局作用域和函数作用域,没有块级作用域)
let
实际上为 JavaScript 新增了块级作用域
# IIFE的延展形态
我们常见的 IIFE 是这样的:
;(function() {
...
})()
1
2
3
2
3
但是不乏看到这样的代码
(function (window) {
console.log(window);
})(window);
1
2
3
2
3
IIFE只执行一次,它可以定义一个匿名函数并且自己传入参数调用
(function (name) {
console.log(name);
})('johan');
1
2
3
2
3
更新时间: 2025/8/10 23:19:43