js中的闭包(一):闭包的基本概念

闭包

新知:

1.闭包的概念

闭包是指有权访问另一个函数作用域中的变量的函数。

function createComparisonFunction(propertyName){
    return function(object1,object2){
        var value1=object1[propertyName];
        var value2=object2[propertyName];
        if(value1<value2){
            return -1;
        }
        else if(value1>value2){
            return 1;
        }
        else {
            return 0;
        }
    };
}

2.作用域链

当创建某个函数时,会创建一个预先包含全局变量对象的作用域链,这个作用域链被保存在内部的[[scope]]属性中。当调用函数时,会为函数创建一个执行环境,然后通过复制函数的[[scope]]属性中的对象构建起执行环境的作用域链。此后,又有一个活动对象(在此作为变量对象使用)被创建并被推入执行环境作用域链的前端。

3.闭包的父函数在执行完毕后,活动对象并不会被消除。 因为闭包的作用域链还在引用父函数的活动对象。

4.由于闭包会携带包含它的函数的作用域,因此会比其他函数占用更多的内存。可通过解除引用以便释放内存

function createComparisonFunction(propertyName){
    return function(object1,object2){
        var value1=object1[propertyName];
        var value2=object2[propertyName];
        if(value1<value2){
            return -1;
        }
        else if(value1>value2){
            return 1;
        }
        else {
            return 0;
        }
    };
}
//创建函数
var compareNames=createComparisonFunction("name");
//调用函数
var result=compareNames({name:"Nicholas"},{name:"Greg"});
//解除对匿名函数的引用(以便释放内存)
compareNames=null;

复习:

执行环境及作用域:

  1. 执行环境:定义了变量或函数有权访问的其他数据,决定了他们各自的行为。

  2. 变量对象:每个执行环境都有一个与之关联的变量对象,环境中定义的所有变量和函数都保存在这个对象中。

  3. 全局执行环境:最外围的一个执行环境。在web浏览器中,全局执行环境被认为是window对象,因此所有全局变量和函数都是作为window对象的属性和方法创建的。

  4. 某个环境中的所有代码执行完毕后,该环境被销毁,保存在其中的所有变量和函数定义也随之销毁。

  5. 每个函数都有自己的执行环境

  6. 环境栈:当执行流进入一个函数时,函数的环境就会推入一个环境栈中。而在函数执行之后,栈将环境弹出,把控制权 返回给之前的执行环境。

  7. 作用域链:当代码在一个环境中执行时,会创建变量对象的一个作用域链。作用域链的前端始终都是当前执行的代码所在的环境的变量对象,如果这个环境是函数,则将其活动对象作为变量对象。活动对象在最开始时只包含一个变量,即arguments对象(这个对象在全局环境中是不存在的)。作用域链中的下一个变量对象来自包含(外部)环境,而再下一个变量对象则来自下一个包含环境。这样,一直延续到全局执行环境;全局执行环境的变量对象始终都是作用域链中的最后一个对象。

垃圾收集:

  1. js中的自动垃圾收集机制:找出那些不再继续使用的变量,然后释放其占用的内存。
  2. 将变量设置为null意味着切断变量与它此前引用的值之间的连接。当垃圾收集器下次运行时,就会删除这些值并回收它们占用的内存。
  3. 一旦数据不再有用,最好通过将其值设置为null来释放其引用——这种做法叫做解除引用。局部变量会在它们离开执行环境时自动被解除引用。
  4. 解除一个值的引用并不意味着自动回收该值所占用的内存。解除引用的真正作用是让值脱离执行环境,以便垃圾收集器下次运行时将其回收。

猜你喜欢

转载自blog.csdn.net/yangyuqingabc/article/details/83042959