• 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

  • 相关阅读:
    springboot+https+http
    3.kettle-定时执行任务
    sqlserver清空删除日志
    C++学习(二)
    随笔(二) 安装Code::Blocks遇到的问题
    随笔(一) tensorflow环境的搭建
    C++学习(一)
    前端学习日记 (三)
    前端学习日记 (二)
    前端学习日记 (一)
  • 原文地址:https://www.cnblogs.com/BAHG/p/12913419.html
Copyright © 2020-2023  润新知