使用闭包的注意点

1.对捕获的变量只是个引用,不是复制;

function f() {
        var num = 1;

        function g() {
            //函数f()被执行之后,运行到此行,g.Scope =>f.LE;
            alert(num);
        }

        num  ;
        g();//当函数g()第一次被执行时,f.LE里num=2;
    }
    f();//弹出2;说明弹出的num是对f.LE里num的引用,而不是复制

2.父函数每调用一次,都会创建一个新的词法环境,会产生不同的闭包;

    function f() {
       var num = 1;
       return function () {
           num  ;
           alert(num);
       }
    }
    var result1= f();//f()第一次被调用,创建了一个新的词法环境 result1.Scope => f.LE

    result1();//2
    result1();//3

    var result2 = f();//f()第二次被调用,又创建了一个新的词法环境 result2.Scope => f.LE

    result2();//2
    result2();//3

3.循环中问题

<div id="1">1</div>
<div id="2">2</div>
<div id="3">3</div>
for(var i = 0;i<=3;i  ){
    //因为JS中没有块级作用域的概念,所以代码扫描到for循环这里时,
    //i是一个全局变量,并且,i=4;for循环只是给ele循环绑定了点击事件;
    //也就是说,onclick事件没有执行的时候,i的值已经是4了
    var ele = document.getElementById("i");
    ele.onclick = function () {
        alert(i);//所以当点击时,都弹出4
    }
}

应用闭包

var i;
    for(i =1;i<=3;i  ){
        var ele = document.getElementById(i);
        ele.onclick = (function (id) {
            return function () {//return一个函数给onclick事件
                alert(id);//捕获父函数的id的值
            }
        })(i);//循环第一次的时候,i=1,立即调用,产生一个闭包,将i作为参数传入,依次
    }

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值