学习闭包的一些发现1

以前说过闭包就是把函数当作返回值,和把函数当作参数,这两种清况就是闭包,那么为什么要把函数当作返回值呢?先看个例子:

function f1(){
            var n = 99;
        }
        console.log(n);
    结果是:
    n is not defined

但是如果写成下面这种形式:

function f1(){
            var n = 99;
            function f2 () {
                console.log(n);
            }
            return f2;
        }
        var result = f1();
        result();
这样就可以访问到n了

这是因为函数有一个作用域链的问题,具体可以看我写的前面的几篇文章,在函数内部没有的属性,他会一直向上查找,在这里在f1的内部,f2是可以访问到f1的属性的,所以我们就要把f2当作f1的返回值,这样我们就可以在外面访问到f1里面的属性了。
这个就是闭包:把函数定义在另一个函数里面
闭包就是连接函数和外面的一坐桥梁。
先看下面一个例子,然后我们会得出闭包的一个注意要点:

function f1(){
            var n = 99;
            add = function  () {
                n+=1;
            }
            function f2 () {
                console.log(n);
            }
            return f2;
        }
        var result = f1();
        result();
        add();
        result();

这里的运行结果是99和100,为什么呢?在第一次执行完之后,并没有清除f1和f2的值,而是在内存中保存了下来,因为result是一个全局变量,把f1给了他也就是f2给了他,但是f2的存在是依赖于f1的,所有他们都在内存当中,而add这个因为没有用var声明,所以它是全局变量,指向了一个匿名函数,所以他的执行,会影响n的值。通过以上的分析,我们可以得出:
使用闭包是比较消耗内存的在一般页面使用可以,在是在比较大型的项目,有可能引起网页的性能问题。在ie中有可能导致内存泄漏,解决办法是在退出函数之前,将不使用的局部变量全部清除。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值