zoukankan      html  css  js  c++  java
  • js立即执行函数

      这两天经理让我出一套js的面试题,我自己都是个刚进入前端的菜鸟,这怎么办啊,赶紧补基础呗。正好这两天项目也做完了,赶紧补充一下基础,临时抱拂脚,不能完全运用,至少也能说出点东西来吧。首先研究的就是js的立即执行函数,以前觉得那叫一个高级啊,有时候用加号有时候用括号,在代码中可以直接执行,仔细看看原来这么简单,这里总结一下吧。

    1.语法

      通常我们使用的是两种(function(){})()或者是(function(){}()),但其实包裹function的那层小括号可以用很多运算符来代替,什么+,-,!啦之类的等等运算符,甚至void,new也可以将其转换为函数表达式,然后再加"()"立即执行。

    2.为什么一定要使用IIFE(Imdiately Invoked Function Expression)

      a)传统的方法啰嗦,定义和执行分开写

      b)传统的方法直接污染全局命名空间 
      一般来说定义函数有两种方式

    //函数声明语句写法
    function test(){};
    test();
    
    //函数表达式写法
    var test = function(){};
    test();

      不难看出,其实在函数后面用()即是调用该函数,那么能不能写function test(){}()呢?答案是不能,因为function test(){}这个部分只是一个声明,对于解释器来说,就好像你写了一个字符串 "function test(){}",它需要使用解析函数,比如eval()来执行它才可以。所以把 () 直接放在声明后面是不会执行,这是错误的语法。变正确的方式很简单,只需要把声明变成 表达式(Expression)就可以了。最常见的办法就是用()括起来,所以才有上述第一点中很多运算符都能立即执行,因为都将声明变成了表达式。

    3.参数

      立即执行函数不去污染全局命名空间,是因为 IIFE 创建了一个新的函数作用域。如果你需要全局对象,那就 pass 给 IIFE。

    (function (global) {
        // 在这里,global就是全局对象了
    })(this)// 在浏览器里,this就是 window 对象

    4.使用时机

      a)当我们需要写一个js文件,并且复用率很高的时候,建议使用。

      b)如果声明的函数只需要调用一次,建议使用。

      c)独立模块,这个和第一点差不多。单独提出来,是想强调一下立即执行函数的好处,开发时,它能做到各模块的低耦合,减少对全局作用域的污染。

    p.s:其实很多人也叫立即执行函数为匿名函数,其实立即执行函数可以有函数名的哦,不信你自己试试吧。

    参考链接:

    https://segmentfault.com/q/1010000000442042

  • 相关阅读:
    081、Weave Scope 多主机监控(2019-04-29 周一)
    080、Weave Scope 容器地图(2019-04-28 周日)
    079、监控利器 sysdig (2019-04-26 周五)
    078、Docker 最常用的监控方案(2019-04-25 周四)
    077、跨主机使用Rex-Ray volume (2019-04-24 周三)
    076、创建Rex-Ray volume (2019-04-23 周二)
    075、配置Virtualbox backend(2019-04-22 周一)
    074、如何安装和配置Rex-Ray?(2019-04-19 周五)
    073、如何实现跨Docker Host 存储? (2019-04-18 周四)
    072、一文搞懂各种Docker网络 (2019-04-17 周三)
  • 原文地址:https://www.cnblogs.com/zmc-change/p/6553591.html
Copyright © 2011-2022 走看看