闭包

闭包:

    /**
     * 循环遍历添加事件监听:
     */
    var btn = document.getElementsByTagName("button");
    for (var i = 0, length = btn.length; i < length; i++) {  //btn为伪数组,避免btn.length每次都计算
        btn[i].index = i;  //存在闭包,需要保存当前索引
        btn[i].onclick = function () {
            alert(this.index + 1);
        };
    }
    /**闭包:
     *     内部函数引用外部函数的变量(函数),闭包是嵌套的内部函数
     *     执行函数定义就产生闭包
     */
    function func() {
        var num = 0;
        function fun() {
            console.log(++num);  //fun引用func的变量num
        }
        return fun;
    }
    var f = func();  //f指向fun
    f();  //1
    f();  //2  变量num未消失
    /**闭包作用:
     *     使函数内部的变量在函数执行完毕后,仍然存放于内存中,延长了局部变量的生命周期
     *     从函数外部可以操作函数内部的变量(函数)
     *     函数执行完毕后,局部变量一般不存在,存在于闭包中的局部变量可能存在
     *     从函数外部不能直接访问函数内部的局部变量,但可通过闭包操作函数内部的局部变量
     */

闭包的生命周期:

    /**闭包的生命周期:
     *     内部函数定义执行完后产生
     *     内部函数成为垃圾对象时生命周期结束
     */
    function func() {
        var num = 0;  //函数提升,此时闭包已产生
        function fun() {
            console.log(++num);  //fun引用func的变量num
        }
        return fun;
    }
    var f = func();
    f();
    f();
    f = null;  //f指向null,fun成为垃圾对象,闭包生命周期结束

闭包作用_自定义模板:

/* module.js */
(function () {
    var msg = 'hello world';
    function func() {
        console.log(msg);
    }
    function fun() {
        console.log(msg + ".");
    }
    window.customModule = {
        func: func,
        fun: fun
    };
})();
/* index.js */
	customModule.func();  //hello world
	customModule.fun();  //hello world.

补充:

    function func() {
        num = 2;  //意外的全局变量
    }
    func();
    console.log(num);  //2
    var str = "hello";
    var obj = {
        str: "world",
        display: function () {
            return function () {
                return this.str;  //this -> window
            }
        }
    };
    alert(obj.display()());  //hello
    var str = "hello";
    var obj = {
    str: "world",
        display: function () {
            var point = this;  //this -> obj
            return function () {
                return point.str;
            }
        }
    };
    alert(obj.display()());  //world
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值