• (转) 什么是立即执行函数?有什么作用?


    作者:方应杭
    链接:https://zhuanlan.zhihu.com/p/22465092
    来源:知乎
    著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

    这是 JS 中的一个常见概念,面试时经常会被问到,请「用自己的语言」简述

    1. 立即执行函数是什么
    2. 立即执行函数有什么用途

    -------------------------------------------

    回答:

    1. 立即执行函数是什么

    立即执行函数就是

    1. 声明一个匿名函数
    2. 马上调用这个匿名函数

    上面是一个典型的立即执行函数。

    • 首先声明一个匿名函数 function(){alert('我是匿名函数')}。
    • 然后在匿名函数后面接一对括号 (),调用这个匿名函数。

    那么为什么还要用另一对括号把匿名函数包起来呢?

    其实是为了兼容 JS 的语法。

    如果我们不加另一对括号,直接写成

    function(){alert('我是匿名函数')}()
    

    浏览器会报语法错误。想要通过浏览器的语法检查,必须加点小东西,比如下面几种

    (function(){alert('我是匿名函数')} ()) // 用括号把整个表达式包起来
    (function(){alert('我是匿名函数')}) () //用括号把函数包起来
    !function(){alert('我是匿名函数')}() // 求反,我们不在意值是多少,只想通过语法检查。
    +function(){alert('我是匿名函数')}()
    -function(){alert('我是匿名函数')}()
    ~function(){alert('我是匿名函数')}()
    void function(){alert('我是匿名函数')}()
    new function(){alert('我是匿名函数')}()
    

    2. 立即执行函数有什么用?

    只有一个作用:创建一个独立的作用域。

    这个作用域里面的变量,外面访问不到(即避免「变量污染」)。

    以一个著名的面试题为例:

    var liList = ul.getElementsByTagName('li')
    for(var i=0; i<6; i++){
      liList[i].onclick = function(){
        alert(i) // 为什么 alert 出来的总是 6,而不是 0、1、2、3、4、5
      }
    }
    

    为什么 alert 的总是 6 呢,因为 i 是贯穿整个作用域的,而不是给每个 li 分配了一个 i,如下:

    那么怎么解决这个问题呢?用立即执行函数给每个 li 创造一个独立作用域即可(当然还有其他办法):

    var liList = ul.getElementsByTagName('li')
    for(var i=0; i<6; i++){
      !function(ii){
        liList[ii].onclick = function(){
          alert(ii) // 0、1、2、3、4、5
        }
      }(i)
    }
    

    在立即执行函数执行的时候,i 的值被赋值给 ii,此后 ii 的值一直不变。

    i 的值从 0 变化到 5,对应 6 个立即执行函数,这 6 个立即执行函数里面的 ii 「分别」是 0、1、2、3、4、5。

    以上,就是立即执行函数的基本概念。

    完。

  • 相关阅读:
    机器人平台框架Yarp
    Git常用使用技巧
    Qt 5.x 开发技巧
    ROS (Robot Operating System) 相关资料与文档
    图形图像技术在手游中的潜在应用
    【Jmeter】Jmeter参数化的几种方式
    【Jmeter】调试取样器(Debug Sampler)进行调试
    【jmeter】实现接口关联的两种方式:正则表达式提取器和json提取器
    【Jmeter】Jmeter安装配置教程
    【Jmeter】第一个接口测试案例
  • 原文地址:https://www.cnblogs.com/mafeifan/p/5881408.html
Copyright © 2020-2023  润新知