什么是闭包?

闭包

闭包的概念

闭包就是能够读取其他函数内部变量的函数;

由于在JavaScript 语言中,只有函数内部的子函数才能读取局部变量,因此可以把闭包简单的理解成“定义在一个函数内部的函数”。在本质上,闭包就是将函数内部和函数外部连接起来的一座桥梁。

当内部函数被保存到外部时,将会生成闭包。闭包会导致原有作用域链不能释放,造成内存泄漏。

闭包的作用

  • 实现共有变量

    eg:函数累加器

    var add = (function (){
        var count = 0;
        return function(){return count  += 1;}
    })();
    
    
  • 可以做缓存(存储结构)

    eg:eater

    function eater() {
        var food = "";
        var obj = {
            eat : function (){
                console.log("i am eating " + food);
                food = "";
                
            },
            push : function (myFood){
                food = myFood;
            }
        }
        return obj;
    }
    var eaters = eater();
    eaters.push('apple');
    eaters.eat();
    
    //   i am eating apple
    
  • 可以实现封装,属性私有化。

  • 实现类和继承

    function Person(){    
    
    var name = "default";   
    return {    
       getName : function(){    
           return name;    
       },    
       setName : function(newName){    
           name = newName;    
       }    
    }    
    };   
    
    var p = new Person();
    p.setName("Tom");
    alert(p.getName());
    
    var Jack = function(){};
    //继承自Person
    Jack.prototype = new Person();
    //添加私有方法
    Jack.prototype.Say = function(){
        alert("Hello,my name is Jack");
    };
    var j = new Jack();
    j.setName("Jack");
    j.Say();
    alert(j.getName());
    
  • 模块化开发,防止污染全局变量

闭包的用途

最大用处有两个:一个是前面提到的可以读取函数内部的变量;另一个就是让这些变量的值始终保持在内存中;

闭包注意点

  1. 由于闭包会使得函数中的变量都被保存在内存中,内存消耗很大,所以不能滥用闭包,否则会造成网页的性能问题。
  2. 闭包会在父函数外部,改变父函数内部变量的值。所以,如果你把父函数当作对象(Object)使用,把闭包当作它的公用方法(PublicMethod),把内部变量当作它的私有属性(private value),这时一定要小心,不要随便改变父函数内部变量的值。

立即执行函数

定义:此类函数没有声明,在一次执行过后即释放。适合做初始化工作。

function traverse() {
    var arr = [];
    for(var i = 0; i < 10; i ++){
        (function (j){
            arr[j] = function () {
                document.write(j + " ");
            }
        }(i));
    }
    return arr;
}
var myArr = traverse();
for(var j = 0; j < 10; j++){
    myArr[j]();
}

// 0 1 2 3 4 5 6 7 8 9 


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值