关于闭包导致外部函数不会被销毁的问题请教一下

下面这个例子是从js高级程序设计上找的,其意思就是内部函数=null之后,外部函数的活动对象才会被销毁

function createComparisonFunction(propertyName) {
    return function(ob1,ob2) {
        var value1=ob1[propertyName];
        var value2=ob2[propertyName];

        if(value1<value2) {
            return -1;
        }
        else {
            return 1;
        }
    }
}

var compareNames=createComparisonFunction("name");
var result= compareNames({name:"cc"},{name:"dd"});
console.log(result);
compareNames=null;


我想再请教一下,如果改成下面这样写,createComparisonFunction这个函数就能被销毁吧?

function createComparisonFunction(propertyName) {
    return function(ob1,ob2) {
        var value1=ob1[propertyName];
        var value2=ob2[propertyName];

        if(value1<value2) {
            return -1;
        }
        else {
            return 1;
        }
    }
}

createComparisonFunction("name");



阅读 3.3k
1 个回答

clipboard.png

按照高程上的意思是,外部函数的活动对象并不是 compareNames 而是我截图的部分。

这部分没有被销毁,是因为,被 createComparisonFunction("name") 返回的匿名函数所引用,而createComparisonFunction("name") 返回的匿名函数又被 compareNames 引用;所以当 compareNames 取消对 匿名函数引用时,匿名函数就可以被销毁了,当匿名函数被销毁了,就没有对象再引用 propertyName 了,然后书上说的 外部函数的活动对象就可以被销毁了。

实际上,不管哪种写法,当 createComparisonFunction 执行完毕的时候,这个函数的执行环境的作用域链会被销毁,只是前一种写法,他的活动对象,不会被销毁,而后一种写法会。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题