js-闭包

1 篇文章 0 订阅

书本上的定义太深奥,网上的版本又多样,还是记一下自己的理解吧!
简单说闭包就是:有权访问其他函数作用域变量的函数!其本质还是函数。
简单的例子:

<script>
function A() {
    var x = 1;
    return function () {
        x++;
        console.log(x);
    }
}
    var rel = A();
    rel();//2
    rel();//3
</script>

这里rel函数就是一个闭包,她可以访问函数A内部变量x的值。
由于rel函数一直在执行A函数,所以A函数内部的变量没有被销毁,这样就实现了保存变量的目的。

闭包注意事项

    • 判断作用域指向的对象是否一致

      例一:

  <script>
function A() {
    var x = 1;
    return function () {
        x++;
        console.log(x);
    }
}
    var rel1 = A();
    rel1();//2
    rel1();//3
    var rel2 = A();
    rel2();//2
    rel1();//4
</script>  

rel1和rel2都重新引用了函数A,是相互独立的。函数被引用时,她才创建执行环境和变量对象,当函数执行完毕后,就会销毁其执行环境和变量对象,这是js函数的执行机制。
例二:

function A() {
    var x = 1;
    var rel = [];
    rel[0] = function () {
        x++;
        console.log(x);
    };
    rel[1] = function () {
        x++;
        console.log(x);
    };
    return rel;
}
    var fun = A();//第一次运行A返回一个数组,这个数组包含了两个函数
    fun[0]();//2
    fun[1]();//3
</script>

这里A只运行了一次,所以fun[0]和fun[1]两个函数指向的都是一个变量对象。

  • 变量的值的判断
    《JavaScript高级程序设计》一书中有这样一个经典的例子:
<script>
    function A() {
        var funs = [];
        for(var i=0;i<10;i++){
            funs[i] = function B(num) {
                return function C() {
                    return num;
                }
            }(i)
        }
        return funs;
    }
    var funs = A();//定义funs[0]到funs[9]这九个函数
    console.log(funs[3]());//3
    console.log(funs[6]());//6
</script>

B、C函数的名字自己取得,便于解释;funs[i]= function B(num)(i)是个立即执行函数,及时把i的值传给局部变量num被函数C存起来,这样就B立即被执行了10次,B就生成10个活动变量!

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值