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

下面这个例子是从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");



阅读 779
评论
    1 个回答

    clipboard.png

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

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

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

      撰写回答

      登录后参与交流、获取后续更新提醒