zoukankan      html  css  js  c++  java
  • day06—JavaScript之闭包

    转行学开发,代码100天——2018-03-22

    第一次听说“闭包”这个词,还是在2015年某个深夜在听一节腾讯课堂的公开课上,当时老师讲什么已经没有清晰的记忆了,只知道是一次web的开发课程。

    过了这么久,又把“闭包”学起,可能还不够深刻,记录下来,日后再补充和完善。

    闭包——就是能够读取其他函数内部变量的函数。在JavaScript中只有函数内部的子函数才能读取其局部变量。闭包可以说是定义在函数内部的函数,连接了函数内部和外部。

        function init() {
                var name="allen";
                function showName()
                {
                    alert(name);
                }
                showName();
            }
    
            init();


    程序执行结果输出为:allen

    上例中 变量name是函数showName()外的局部变量。showName()是函数init()的一个内部函数,仅在函数体内部使用,也就是本文所说的“闭包”。showName()中使用了父函数中的局部变量name。showName()自身没有变量,但是它可以访问外部变量name。

    然而,当showName()函数内部定义同名变量后,程序执行输出该自身变量的值,如:

        function init() {
                var name="allen";
                function showName()
                {
                    name ="july";
                    alert(name);
                }
                showName();
            }
    
            init();

    程序执行输出:july

     若将函数改为如下:

        function init()
            {
                var name ="allen";
                function showName()
                {
                    alert(name);
    
                }
                return showName;
    
            }
            var ss = init();
            ss();

    执行结果与最初一致,即输出:allen。

    与之前不同的是showName()函数被init()方法返回。这与一般“函数内部定义的变量,在函数执行完毕后不能再次访问”的认识显然不符。也就是说该段程序中,name变量的值一直在被保留。若上面的这段程序中,直接调用init();则并不会输出任何结果,即表明在内部函数 showName() 在执行前,被外部函数返回

     产生这种现象,有人说是一种bug。某种程度上,比较接受这种方式,不然也不会在此伤脑细胞了解JavaScript的这个“特色”了。既然不可不知,就还是试图理解:

    JavaScript中的函数会形成闭包。 闭包是由函数以及创建该函数的词法环境组合而成。这个环境包含了这个闭包创建时所能访问的所有局部变量。

     那闭包有什么用呢?

    1.我们可以使用闭包来模拟私有方法。私有方法不仅仅有利于限制对代码的访问:还提供了管理全局命名空间的强大能力,避免非核心的方法弄乱了代码的公共接口部分。通常使用只有一个方法的对象的地方,都可以使用闭包。

    。。。未完,后续补充。

    心未老,即奋不顾身!
  • 相关阅读:
    全宁对医药行业销售代表的介绍
    effective c#读书笔记之二 静态成员的初始化
    自学笔记
    effective c#读书笔记之一
    如何判断表中是否有值
    领域驱动
    VIM 打造自己的VIM界面!
    Jqueryui的用法!
    php中io操作!
    php中Http请求!
  • 原文地址:https://www.cnblogs.com/allencxw/p/8627698.html
Copyright © 2011-2022 走看看