闭包

早过忘川 提交于 2019-11-28 19:49:00

啥是闭包

内部函数被保存到了外部,一定生成闭包。

【例】如下,b函数被保存到了外部,输出结果为101、102

function a () {
            var num  = 100;
            function b () {
                num ++;
                document.write(num);
                }
                return b;
        }
        var glob = a();
        glob();
        glob();

闭包缺点

闭包会导致原有作用域链不能释放,造成内存泄漏。

闭包作用

实现公有变量

【例】函数累加器

	function add () {
	            var count = 0;
	            function sum () {
	                count ++;
	                document.write(count+"\n");
	            }      
	            return sum;
	        }
	        var counter = add();
	        counter();
	        counter();

可以做缓存

【例】简易存储结构

function eater () {
            var food = "";
            var obj = {
                eat : function () {
                    document.write("I am eating "+ food);
                    food = "";
                },
                push : function (myfood) {
                    food = myfood;
                }
            }
            return obj;
        }
        var eater1 = eater();
        eater1.push("honey");
        eater1.eat();

可以实现封装,属性私有化

模块化开发,防止污染全局变量

立即执行函数

针对初始化功能的函数(只执行一次,执行后再也不需要,不希望它继续占内存)
两种形式

  • (function () {} () );W3C建议
  • (function () {} ) ();

为什么这样做就相当于立即执行函数?
答:因为练习正常执行函数都是函数的引用或者说名称加上执行符号(),例如test();这里所说的函数的引用或者说名称实际上代表了函数的表达式,在函数表达式后面加上执行符号就代表执行函数,此处(function () {} () ); (function () {} ) ();

【例】1

//可以执行,因为var 变量名 = function(){}相当于函数表达式
        //执行之后再访问test1为undefined,
        //因为function作为立即执行函数执行后放弃了表达式的名称test1
        var test1 = function () {
            document.write("doing");
        }();

【例】2

//会报错,不能执行,因为cichufunction是函数声明,而不是表达式
        function test2 () {
            document.write("doing");
        }();

【例】3

//不能执行,但是不会报错,对比test2由于立即执行符号()传了参数
        //所以系统会把函数后面的立即执行符号看作单独的一行表达式
        // function test3 (a, b, c, d) {
        //     document.write(a + b + c +d);}
        //(1,2,3,4);此处与直接写1,2,3,4其实一样
        function test3 (a, b, c, d) {
            document.write(a + b + c +d +"doing");
        }(1,2,3,4);

【例】4

//能执行,因为+把函数声明转换为表达式,同时! - || &&都可以
        +function test4 () {
            document.write("doing");
        }();
标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!