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

。。。未完,后续补充。

心未老,即奋不顾身!
原文地址:https://www.cnblogs.com/allencxw/p/8627698.html