JS的IIFE

1. 定义

IIFE: Immediately Invoked Function Expression,意为立即调用的函数表达式,也就是说,声明函数的同时立即调用这个函数。

首先我们要了解一般情况下什么是函数声明语句,什么是函数表达式语句,以便于接下来的实验。

辨别方法:以“function”开头的有名称的函数是函数声明语句。

  function a();    //函数声明语句

  var a = function();  //函数表达式语句

下面分析一道面试题:

var a = function(){}

var b = function(){}

console.log(a()+b());//输出结果是NaN

为什么输出结果是 NaN 呢?

因为解释器会把前面的 a() 认为是一个语句块的结束,后面的 ‘+’ 一元运算符有把后面 b() 转换为数字这么一个功能,所以得到的结果是NaN。因此我们在做自执行函数的时候,要把函数的声明变为函数表达式,这样就不会影响输出的结果了。

2. IIFE的常见形式

写法一:

(function(){

})()

写法二:

(function(){

}())

这两种写法效果完全一样,使用哪种写法取决于你的风格,貌似第一种写法比较常见。

3. IIFE的函数名和参数

不过函数名在这里没有意义,因为整个函数在执行时就立即调用了。当然也可以给一个函数名,这里我们就叫 IIFE。IIFE可以带(多个)参数,比如下面的形式:

var a = 2;
(function IIFE(global){
    var a = 3;
    console.log(a); // 3
    console.log(global.a); // 2
})(window);

console.log(a); // 2

这里 window是形参,global是实参,var a = 3 只在 IIFE 函数作用域中起效。

4. IIFE的优点

1. 创建块级(私有)作用域,避免了向全局作用域中添加变量和函数,因此也避免了多人开发中全局变量和函数的命名冲突

2. IIFE中定义的任何变量和函数,都会在执行结束时被销毁。这种做法可以减少闭包占用的内存问题,因为没有指向匿名函数的引用。只要函数执行完毕,就可以立即销毁其作用域链了。

以上参考 https://www.cnblogs.com/keketest/p/6121228.htmlhttps://www.jianshu.com/p/af9283d20ba5https://www.cnblogs.com/yiven/p/8462666.html

原文地址:https://www.cnblogs.com/BAHG/p/12913419.html