匿名函数,及其与闭包的区别

在前面写了一个闭包的博客,现在需要将JavaScript中的匿名函数进行进行一步的总结概括。来区分一下闭包和匿名函数。

一:常规函数

function show1(){
        console.log("kaka1");
    };
      show1();//调用

分析:
在上述代码中,使用函数名加括号的方式进行调用,这是常规函数的调用方式。函数名只是一个引用,使用()才代表执行

二:匿名函数

一:第一段代码

function(){
        console.log("匿名函数");
    }

这就是匿名函数,他没有名字,这段匿名函数在开发工具中是会报错的,报错信息显示为缺少函数名。
二:第二段代码

(function(){
        console.log("匿名函数");
    });

这段代码在开发者工具中是不会报错的,它相当于第三段代码,为匿名函数赋一个引用;实际上给匿名函数加上小括号后,他返回的,就是一个匿名函数的Function对象。因此匿名函数加上小括号就相当于是有名字的函数被我们取到他的引用位置
三:第三段代码

 var show2 = function(){
        console.log("kaka2");
    };
      show2();//调用

分析:
在这段代码中函数实际上就是一个匿名函数,但是由于给这个函数声明了一个引用,所以他的使用就和show1()的使用是一样的。
四:第四段代码

(function(){
        console.log("匿名函数");
    })();

分析:
匿名函数的自调用
当调用正常的常规函数时,我们使用函数名+()就可以进行调用,在第二段代码中我们分析得到匿名函数外边包裹上括号就相当于是获取到这个匿名函数的引用,因此在后边添加一个括号就可以实现匿名函数的自调用。如果有参数要传可以直接在括号内添加参数列表。
例如:

(function(a,b){
        console.log(a + b);
    })(2,3);

三:匿名函数和闭包

    <div>1</div>
    <div>2</div>
    <div>3</div>
var divArr = document.getElementsByTagName("div");
    for (var i = 0;i < divArr.length;i++){
        (function(i){
            divArr[i].onclick = function(){
                console.log(i);
            }
        })(i);
    }

分析:
明明是匿名函数的自调用,为什么还会有闭包的插足???
首先这个问题是由于js中var的声明变量的特殊性造成的,解决的策略就是使用闭包。具体的分析请看我的另一篇博客《刨根问底看闭包》。https://blog.csdn.net/sun_DongLiang/article/details/84307199
那为什么在这会有匿名函数和闭包的混淆呢?
首先可以肯定的是,这是匿名函数的形式,但是他又有着闭包的功能!!!
分析一下:在没有使用闭包的情况下,由于点击事件和for循环是异步执行的,最后for循环已经执行完了,i已经变成3了,而click还没有执行,他输出的不就是最后的i值3了吗?
如果添加了闭包,我们通过匿名函数的自调用的形式,将i传进去,并且进行自调用声明了这个点击事件click,而且闭包闭包,他有封闭的概念,你外面的变量污染不到我,因此在点击时所取到的i值就不是3了,也就不会再出现原来的那个问题了。
综上所述:
匿名函数和闭包其实不是两个独立的概念,有人称匿名函数的自调用就是闭包其实也是有一定的道理的,但是应当肯定的是,使用闭包的绝对判断依据是匿名函数中是否有未销毁的局部变量。在上边的那个点击事件函数中,每一次循环,进来的i不会被销毁。因此也就是使用了闭包。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值