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

发布于 2022-09-11 22:22:57 字数 908 浏览 36 评论 0

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



如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

故事灯 2022-09-18 22:22:57

clipboard.png

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

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

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

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文