对js中立即执行函数的理解

130 阅读3分钟

立即执行函数的定义

立即执行函数IIFE(自执行匿名函数): 定义了一个函数,无需引用,立即执行

即,理想状态下,我们希望立即执行函数是这样的
function(){}()

但是,在JavaScript脚本解析引擎中,这样是会报错的,报错为,后面的括号多余,因为实际上,function在js中,可以是个语句,也可以是个表达式,脚本引擎是为了区分function,认为,一般以function为行首,一律解析为这是个函数语句

//function fn(){}为语句
function fn(){}
//function(){}为表达式
var fn=function(){}

扩展:语句和表达式的区别

语句

语句的构造如下:值、运算符、表达式、关键词和注释。
语句会按照它们被编写的顺序逐一执行。

表达式

会产生一个值,这个值可以放在语句任何需要的地方

语句和表达式的区别在于:语句是执行一系列操作,一般情况不需要返回值,而表达式需要得到值,一定需要返回值

立即执行函数的写法

解决的方法为,让function不在行首,使function成表达式 一般有两种写法

//第一种,将函数定义和调用包裹起来function(){}())
//第二种,将函数定义包裹起来,再调用
((function (){})())

相当于以下写法

var a=funcition(){}
a()

立即执行函数传参

立即执行函数传参的时候是这样的

//在函数内部a=10
((function (a){})(10))

立即执行函数的作用

1.形成闭包,并解决闭包引用外部变量的问题

<body>
    <ul id="list">
        <li>公司简介</li>
        <li>联系我们</li>
        <li>营销网络</li>
    </ul>
    <script>
    var fn(){
        var list = document.getElementById("list");
        var li = list.children;
        for(var i = 0 ;i<li.length;i++){
        li[i].onclick=function(){
          alert(i);  // 结果总是3.而不是0,1,2
        }
      }
    }
       
     </script>  
</body>

代码中,将li写在立即执行函数中,使之由全局变量成为局部变量,并让里面包含的函数使用。因为此时ivar 定义的,故挂载在全局作用域中,故当我们点击li时,循环肯定结束了,此时只能里外的引用的是全局中的i,循环结束后结果为3,所以要想点击输出0,1,2,就要使i有自己的作用域,应该使用立即执行函数或者使用es6中的块级作用域let定义,使每一个遍历的i有自己的作用域,如下

//立即执行函数
 <script>
    var fn(){
        var list = document.getElementById("list");
        var li = list.children;
        for(var i = 0 ;i<li.length;i++){
            (function(i){ 
                li[i].onclick=function(){
                  alert(i);  // 结果是0,1,2
            }}(i))
      }
    }
       
</script>  
//es6
 <script>
    var fn(){
        var list = document.getElementById("list");
        var li = list.children;
        for(let i = 0 ;i<li.length;i++){
            li[i].onclick=function(){
            alert(i);  // 结果是0,1,2
      }
    } 
</script>  

由此可知,一般情况下,立即执行函数和闭包经常一起出现,因为可以使变量由全局变量变成局部变量,故而形成闭包,

2.避免全局变量污染

不必为函数取名,避免全局变量污染,如果该函数只调用一次,则节省程序员找函数在哪被引用的时间

3.形成独立作用域,封装变量

立即执行函数里面的变量外部是不能访问的,因此确保变量不会被恶意修改,也可将变量封装

编写不易,点个赞关注一下再走吧!