JavaScript 闭包 css html

闭包

什么是闭包

JavaScript的作用域包括全局作用域函数作用域块级作用域

在JavaScript作用域环境中访问变量的权利是由内向外的,内部作用域可以获得当前作用域下的变量,并且可以获得包含当前作用域的外层作用域下的变量,反之则不能,也就是说在外层作用域下无法获取内层作用域下的变量,同样在不同的函数作用域中也是不能相互访问彼此变量的。

那么我们想在一个函数内部也有限权访问另一个函数内部的变量该怎么办呢?闭包就是用来解决这一需求的。

闭包的本质就是在一个函数内部创建另一个函数。

闭包有3个特性:

  • 函数嵌套函数

  • 函数内部可以引用函数外部的参数和变量

  • 参数和变量不会被垃圾回收机制回收

示例:闭包

function a(){
    //name被var修饰,因此name只能在函数a内部被访问
    var name="tom";
    //函数a的返回值是一个匿名函数
    return function(){
        //此次可以访问函数a内部的变量name
        return name;
    }
}
var b = a()       //函数a的返回值,就是函数a内部的匿名函数,赋值给了b,因此b也是一个匿名函数
var res = b()     //调用b的匿名函数,返回了函数a内部的name的值,这就是闭包,获取了函数内部是私有成员
console.log(res); //输出tom

在这段代码中,a()中的返回值是一个匿名函数,这个函数在a()作用域内部,所以它可以获取a()作用域下变量name的值,将这个值作为返回值赋给全局作用域下的变量b,实现了在全局变量下获取到局部变量中的变量的值。

闭包与垃圾回收

示例:

function fn(){
     var num= 3;
     return function(){
        var n= 1;
        console.log(++n);
        console.log(++num);
     }
}
var fn1 = fn();
fn1(); //第一次调用fn1函数,输出结果:2 4
fn1(); //第二次调用fn1函数,输出结果:2 5

一般情况下,在函数fn执行完后,就应该连同它里面的变量一同被销毁,但是在这个例子中,匿名函数作为fn的返回值被赋值给了fn1,这时候相当于

fn1 = function(){
    var n =1;
    console.log(++n);
    console.log(++num);
}

并且匿名函数内部引用着fn里的变量num,所以变量num无法被销毁,而变量n是每次被调用时新创建的,所以每次fn1执行完后它就把属于自己的变量连同自己一起销毁,最后就剩下num

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值