• 6. 闭包浅谈


     闭包:外部作用域访问内部作用域中变量的方法叫做闭包

    1. 可以看成是for循环先执行,第一个function中 i 是10.

    // 这段代码输出的是10个10而不是期望的0到9,因为闭包内是对i的引用,然后函数执行时i已经变成了10
    function f1() {
        for (var i = 0; i < 10; i++) {
            setTimeout(function() {
                console.log(i)
            }, 1000);
        }
    }
    f1();

    2. 第二个function中e 有 i的拷贝(1到10的拷贝)

    // 解决以上的问题可以采用自执行的匿名函数
    function f2() {
        for (var i = 0; i < 10; i++) {
            (function(e) {
                setTimeout(function() {
                    console.log(e);
                }, 1000);
            })(i);
        }
    }
    f2();
    // 这里的匿名函数将i作为参数,这里的e会有i的一个拷贝,而引用时是对e的引用,这就避免了上述的问题

    3. 闭包的2种常见写法

    // 写法一:
    var li = document.getElementsByTagName('li');
    for (var i = 0; i < li.length; i++) {
        li[i].onclick = (function(n){
            // 内部的函数被绑定到事件上了( 父函数运行,然后把里面的函数返回了,然后返回给绑定的事件上 );
            return function(){
                alert(n);
            }
        })(i);
    }
    // 写法二:
    var li = document.getElementsByTagName('li');
    for (var i = 0; i < li.length; i++) {
        (function(n){
            li[i].onclick = function(){
                alert(n);
            }
        })(i);
    }
  • 相关阅读:
    有个名字叫随便乱记——css3
    CSS3伸缩布局
    路政整理
    GIst
    SVN回滚版本
    你需要知道的CSS3 动画技术
    iScroll框架的使用和修改
    CSS3阴影 box-shadow的使用和技巧总结
    Javascript异步编程的4种方法
    zepto学习零碎
  • 原文地址:https://www.cnblogs.com/zouxinping/p/4955362.html
Copyright © 2020-2023  润新知