闭包

 function createComparisionFunction(propertyName){
           return function(obj1,obj2){
               var val1=obj1[propertyName];
               var val2=obj2[propertyName];

               if(val1<val2){
                   return -1;
               }else if(val1>val2){
                    return 1;
               }else{
                   return 0;
               }
           }
       }
       var object1={name:"aaa",age:"12"};
       var object2={name:"bbb",age:"22"};
       var func=createComparisionFunction("name");
       var res=func(object1,object2);    //-1

标注红色的两行代码是内部代码中的代码,这两行代码访问了外部函数中的变量 propertyName。即使这个内部函数被返回了,在其他地方调用,仍能够访问变量propertyName。之所以还能够访问这个变量,是因为内部函数的作用域链中包含createComparisionFunction()的作用域。

在匿名函数从createComparisionFunction()中被返回后,它的作用域链被初始化为包含createComparisionFunction()函数的活动对象和全局变量对象。这样,匿名函数就可以访问在函数createComparisionFunction()中定义的所有变量。更重要的是,createComparisionFunction()函数在执行完毕后,其活动对象不会被销毁,因为匿名函数的作用域链仍然在引用这个活动对象。换句话说,当createComparisionFunction()函数返回后,其执行环境的作用域链会被销毁,但它的活动对象仍然会留在内存中;直到匿名函数被销毁后,createComparisionFunction()活动对象才会被销毁。

原文地址:https://www.cnblogs.com/jcbo/p/6761717.html