IIFE

一、了解立即调用函数表达(IIFE)

JavaScript 中的一个常见模式就是,函数在声明后立刻执行:

1
2
3
4

(function () {
  console.log("Chirp, chirp!");
})();

这是一个匿名函数表达式,立即执行并输出 Chirp, chirp!。

请注意,函数没有名称,也不存储在变量中

函数表达式末尾的两个括号()会让它被立即执行或调用。

这种模式被叫做立即调用函数表达式(immediately invoked function expression) 或者IIFE。


二、使用 IIFE 创建一个模块

一个立即调用函数表达式(IIFE)通常用于将相关功能分组到单个对象或者是 module 中

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11

function glideMixin(obj) {
  obj.glide = function() {
    console.log("Gliding on the water");
  };
}
function flyMixin(obj) {
  obj.fly = function() {
    console.log("Flying, wooosh!");
  };
}

可以将这些 mixins 分成以下模块:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15

let motionModule = (function () {
  return {
    glideMixin: function(obj) {
      obj.glide = function() {
        console.log("Gliding on the water");
      };
    },
    flyMixin: function(obj) {
      obj.fly = function() {
        console.log("Flying, wooosh!");
      };
    }
  }
})();

注意: 一个立即调用函数表达式(IIFE)返回了一个 motionModule 对象。

返回的这个对象包含了作为对象属性的所有 mixin 行为。

module 模式的优点是,所有的运动相关的行为都可以打包成一个对象,然后由代码的其他部分使用。

下面是一个使用它的例子:

1
2
3
4
5
6
7
8

let duck = {
  name: "Donald",
  numLegs: 2
};

motionModule.glideMixin(duck);
duck.glide(); // Gliding on the water