zoukankan      html  css  js  c++  java
  • 使用闭包的注意点

    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作为参数传入,依次
        }
  • 相关阅读:
    vue截取video视频中的某一帧
    sm加密前端解析--JS实现国密算法SM2加密
    前端js解析识别图片二维码
    如果让你来设计一个分页功能, 你会怎么设计? 前后端如何交互?
    jQuery事件
    如何实现文件上传?说说你的思路
    实现JWT鉴权机制
    对中间件概念的理解,如何封装 node 中间件
    Node 文件查找的优先级以及 Require 方法的文件查找策略
    angularjs input使用ng-model双向绑定无效bug解决
  • 原文地址:https://www.cnblogs.com/sunxirui00/p/7550822.html
Copyright © 2011-2022 走看看