当前位置:嗨网首页>书籍在线阅读

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仍然很常用。比如,当想创建一个闭包并给外界返回信息时,它们就很给力了。