08-即时调用函数表达式
7.7 即时调用函数表达式
第6章介绍了函数表达式。函数表达式允许创建即时调用函数表达式(IIIFE)。IIFE声明了一个函数,并立即执行该函数。现在已经掌握了作用域和闭包的概念,也具备了必要的背景知识去理解为什么要这样做。接下来学习IIFE,它的形式如下:
(function() {
// 这里为 IIFE 代码
})();
这段代码中,使用函数表达式创建了一个匿名函数,然后立即调用该函数。IIFE的好处是,任何内部信息都有自己的作用域,并且因为它本身就是函数,它还可以向作用域外传递信息。
const message = (function() {
const secret = "I'm a secret!";
return `The secret is ${secret.length} characters long.`;
})();
console.log(message);
在IIFE的作用域内,变量 secret 是安全的,并且外部不能访问它。可以从IIFE中返回任何想要的结果,比较常见的返回值有数组、对象,以及函数。考虑这样一个函数,它可以打印出自己被调用的次数,而且次数不会被篡改:
const f = (function() {
let count = 0;
return function() {
return `I have been called ${++count} time(s).`;
}
})();
f(); // "I have been called 1 time(s)."
f(); // "I have been called 2 time(s)."
//...
因为变量 count 被安全地隐藏在IIFE中,外界没法篡改它:函数f始终能准确地计算出自己被调用的次数。
在ES6中,虽然块作用域变量从某种程度上减少了对IIFE的需求,但IIFE仍然很常用。比如,当想创建一个闭包并给外界返回信息时,它们就很给力了。