`

javascript--闭包彻底弄清楚

 
阅读更多

 

  • <!DOCTYPE html>
    <html>
    <head>
        <meta charset="utf-8">
        <title>测试</title>
        <script type="text/javascript">
            /****
             * 首先说明:本例子旨在说明闭包的概念
             * 如果只是为了获取点击哪一行li,方法很多,比如给其对象加索引等等
             * lis[i] = i;下面就可以使用啦
             *
             * 闭包的标准概念(泛一点的概念是函数处处是闭包):
             * 将一个函数嵌套在另一个函数内部.被嵌套的函数 (内部函数)是只属于嵌套它的函数(外部函数)的私有函数.
             这样就形成了一个闭包.
             下面的英文是MDN上面摘抄的
             B forms a closure including A, i.e. B can access A's arguments and variables.
             C forms a closure including B.
             Because B's closure includes A, C's closure includes A,
             C can access both B and A's arguments and variables.
             In other words, C chains the scopes of B and A in that order.
             **/
            window.onload = function () {
                var lis = document.getElementsByTagName("LI");
                for (var i = 0, j = lis.length; i < j; i++) {
                    /*
                     其实一和二的写法没有什么区别,闭包的编码模式一般来说是这样的,
                     函数A内部定义啦一个函数B,函数B返回引用给其调用者A,并且赋值给其他作用域中的变量C
                     当C执行的时候,调用的是A返回的B的引用。这个时候即时A不存在啦,B依然可以获取到A定义的局部变量。
                     下面的2个变体当中无论是给自执行函数传递参数,函数在自执行函数里面定义一个变量获取外部的变量,
                     都是自执行函数所定义的局部变量,这里自执行函数就相当于A,返回的函数就相当于B,
                     lis[i].onclick就相当于C
                     */
    //方法一
    //                 lis[i].onclick = function (arg) {
    //                 return function () {
    //                 alert(arg);
    //                 };
    //                 }(i);
    
    
    //方法二
    //                lis[i].onclick = (function () {
    //                    var row = i;
    //                    /*
    //                    var B  = function(){
    //                     alert(row);
    //                     };
    //                     return B;
    //                     */
    //                    return function () {
    //                        alert(row);
    //                    };
    //                })();
    
    //方法3---这里涉及到的是Function的作用,直接创建的一个闭包。
                    /*
                     * Function 构造器创建一个新的Function 对象.
                     * 在JavaScript中每个函数(function)实际是一个Function对象.
                     * Function---函数构造器(A)的内部包含一个匿名的函数体(B)  lis[i].conclick(C)
                     * */
    //                lis[i].onclick = Function('alert(' + i + ')');
    
    //方法4---跟方法3差不多,方法3的构造器里面最后一个就是函数体返回给啦onclick
    // 二方法四,只不过是执行构造函数里面的函数体,然后返回一个函数给onclick。
    // 只要记住闭包的标准公司保管你不会错
                    lis[i].onclick = (Function("\nreturn(function() {\n\talert("+i+");\n});"))();
    
                }
    
    
                //from mdn--来自火狐开发者中心
                // 下例演示了一个嵌套函数:就代指我们所说的标准定义的闭包模式
                //addSquares---A   square-----B  a,b,c---C
                function addSquares(a, b) {
                    function square(x) {
                        return x * x;
                    }
                    return square(a) + square(b);
                }
                a = addSquares(2, 3); // returns 13
                b = addSquares(3, 4); // returns 25
                c = addSquares(4, 5); // returns 41
                /*由于内部函数形成了一个闭包, 你可以把这个内部函数当做返回值返回,
                该函数引用到了外部函数和内部函数的两个参数 */
                function outside(x) {
                    function inside(y) {
                        return x + y;
                    }
                    return inside;
                }
    
                fn_inside = outside(3);
                result = fn_inside(5); // returns 8
    
                result1 = outside(3)(5); // returns 8
    
    
                /***
                 * 闭包内参数冲突,靠近优先原则(作用域链)
                 * @returns {Function}
                 */
                function outside() {
                    var x = 10;
                    function inside(x) {
                        return x;
                    }
                    return inside;
                }
                result = outside()(20); // returns 20 instead of 10
    
    
                //再来一个闭包的例子,数字累加
                /****
                 * 函数A(count)里面包含函数B(add),函数B返回引用给函数A,并且赋值给其他作用域作的局部变量C(myCount)
                 * @returns {Function}
                 */
                var count = function(){
                    var i=0;
                    var add = function(){
                        return i++;
                    }
                    return add;
    
                };
                var myCount = count();
    
                myCount();//0
                myCount();//1
    
            }
        </script>
        <style type="text/css">
            li {
                height: 30px;
                background: yellow;
            }
        </style>
    </head>
    <body>
    <ul>
        <li>1</li>
        <li>2</li>
        <li>3</li>
        <li>4</li>
        <li>5</li>
    </ul>
    </body>
    </html>
     
分享到:
评论

相关推荐

    javascript-闭包详解.doc

    javascript-闭包详解.doc

    极小S-负传递闭包的一个求解方法

    在给定的文件信息中,提到的研究内容涉及了模糊逻辑、模糊关系以及负传递闭包的相关知识点。以下是对文件中知识点的详细解释。 首先,标题中提到的“极小S-负传递闭包”的概念是模糊逻辑领域中的一个高级主题。在...

    org.mozilla.javascript-1.7.2.jar

    1.7.2版本发布于2009年,虽然相对较旧,但仍然包含了许多关键的JavaScript语言特性,如函数、对象、数组、正则表达式等,以及一些高级特性如闭包和原型链。 使用"org.mozilla.javascript-1.7.2.jar",开发者可以...

    swift菜鸟入门视频教程-07-闭包

    在这个“Swift菜鸟入门视频教程-07-闭包”中,我们将深入探讨Swift中的一个重要概念——闭包。闭包在编程中是一种功能强大且灵活的工具,它允许我们定义可存储和传递的匿名函数。 闭包在Swift中的基本概念: 1. **...

    论文研究-基于网络闭包理论的交易型社区网络演化研究.pdf

    论文研究-基于网络闭包理论的交易型社区网络演化研究.pdf, 随着社会化商务时代的到来,交易型社区的发展越来越成为解决社会化商务中经济性与社会性矛盾的关键.但交易型...

    python 03、PYTHon 模块包异常处理 4-1_闭包、装饰器_Day04_AM.mp4

    python 03、PYTHon 模块包异常处理 4-1_闭包、装饰器_Day04_AM.mp4

    ios-Swift使用闭包实现类似于BlocksKit添加点击事件功能.zip

    在本案例中,我们关注的是"ios-Swift使用闭包实现类似于BlocksKit添加点击事件功能",它通过ClosuresKit库实现了类似的功能。 首先,我们要理解什么是闭包(Closure)。闭包是Swift中的一个重要概念,它可以捕获和...

    ch8-关系的闭包和等价关系-集合论1

    在计算机科学中,集合论和离散数学是基础理论,其中关系的闭包和等价关系是重要概念。本文将详细阐述这些概念及其应用。 首先,我们关注“关系的闭包”。关系闭包是指在给定集合A上的一个关系R,通过某种运算扩展R...

    离散数学-关系的闭包.ppt

    自反闭包Gr可以通过在每个顶点处添加一个自环来形成,对称闭包Gs通过将所有单向边变为双向边实现,而传递闭包Gt则需要通过查找并添加所有可能的传递路径来构建。 总之,离散数学中的关系闭包是理解和操作数据结构、...

    论文研究-求解最小闭包球问题改进的SMO-型算法.pdf

    研究[n]维空间中[m]个点的最小闭包球(MEB)问题。通过结合确定并删除内部点的技术到序列最小最优化(SMO)方法中,提出一种近似求解MEB问题的改进的SMO-型算法。证明了该算法具有线性收敛性。数值结果表明对于一些...

    西南交通大学-离散数学编程作业-关系矩阵求闭包

    编程题目:基于关系的矩阵表示,实现关系的自反闭包、对称闭包、传递闭包运算,并计算A上的关系R={,b&gt;,,a&gt;,,c&gt;,,d&gt;}的自反闭包、对称闭包、传递闭包,其中A={a,b,c,d}. 编程内容及要求: 编写程序,基于关系的矩阵...

    yjc930214#Blog-1#闭包1

    1.可以读取函数内部的变量 2.可以是变量的值长期保存在内存中,生命周期比较长 3.可以用来实现JS模块

    理解_JavaScript_闭包

    本文结合 ECMA 262 规范详解了闭包的内部工作机制,让 JavaScript 编程人员对闭包的理解从“嵌套的函数”深入到“标识符解析、执行环境和作用域链”等等 JavaScript 对象背后的运行机制当中,真正领会到闭包的实质。

    M- L-闭包系统间的特殊映射及其范畴性质 (2012年)

    定义了M- L-闭包系统和M- L-闭包系统间的连续映射、开映射、闭映射,讨论了这些映射的性质.证明了范畴M- L-CS (即M- L-闭包系统及它们之间的连续映射构成的范畴)是topological construct .作为应用,给出了M- L-闭包...

    17-闭包和装饰器(python和linux高级编程阶段 代码和截图)

    17-闭包和装饰器(python和linux高级编程阶段 代码和截图)17-闭包和装饰器(python和linux高级编程阶段 代码和截图)17-闭包和装饰器(python和linux高级编程阶段 代码和截图)17-闭包和装饰器(python和linux高级...

    极小S-负传递闭包的一个求解方法 (2012年)

    为了实现极小S-负传递闭包的求解,文章提出了行构造方法,具体步骤如下:首先定义第一行,然后依次定义后续各行为max{R(aj+1,ak), U(aj+1,ak), V},这样可以得到一个满足极小S-负传递闭包定义的模糊关系。...

    JavaScript-code_sampe

    JavaScript的知识体系广泛,可能包括变量与数据类型、控制流(如条件语句、循环)、函数、对象、数组、字符串操作、DOM操作、事件处理、AJAX异步通信、闭包、原型链、模块化、Promise、Async/Await等内容。...

    深入理解javascript原型和闭包

    深入理解javascript原型和闭包(01)——一切都是对象 深入理解javascript原型和闭包(02)——函数和对象的关系

    Java闭包 Java闭包

    JSR-335 将闭包引入了 Java 。闭包在现在的很多流行的语言中都存在,例如 C++、C# 。闭包允许我 们创建函数指针,并把它们作为参数传递。在这篇文章中,将粗略的看一遍Java8的特性,并介绍 Lambda表达式。而且将试...

    javascript深入理解js闭包.docx

    在JavaScript中,闭包是一种特殊的函数,它能够访问并操作其定义时的作用域,即使该作用域在其执行时已经不存在。闭包的概念是基于JavaScript的词法作用域规则,即函数内部可以访问到外部的变量,但外部不能直接访问...

Global site tag (gtag.js) - Google Analytics