0

每当使用传递给它的参数调用匿名函数时,这实际上会打包匿名函数中的所有内容,并且如果在第一个匿名函数从数据库或ajax调用回调之前调用了对订阅函数的另一个调用,这不会影响以前的匿名函数,并且当前正在调用的匿名函数只会创建一个新的闭包,并且每个新匿名闭包的所有数据都不会影响下一个闭包或上一个闭包?

       this.subscribe.call(this, e.horizontaladded, function (a, fn) {

            if (!a.extra.owner.id) { return; };

       (function (a) {


                dataBase.insert(
                    dbPart(
                    ['horizontal?a=', a.extra.owner.instanceName, '&id=', a.extra.owner.id].join(''),
                    a.target
                    ),
                    dbCB(success, error)
                );


                function success(data, status) {

                    if (status === 'error') { return; };

                     console.log('Horizontal Added');


                    a.target.id = data.id,
                    a.target.HTML().addClass('alum_' + data.id),
                    a.target.finish.id = data.finishID,
                    a.target.size.id = data.sizeID,
                    a.target.siteLine.id = data.sitelineID;


            }(a));

   }, true);

换句话说,对于每个调用我订阅的 e.horizo​​ntaladd 的调用,每个新的匿名函数都会被调用,并用它自己的所有人员数据关闭,垃圾收集会清理所有的闭包吗?

因此,如果我订阅了这个函数,如果进行了 30 次水平添加调用并创建了 30 个闭包,那么当回调数据库成功时,闭包会自行清理吗?

4

1 回答 1

1

当没有代码可能到达闭包内的任何变量时,垃圾收集器会清理闭包。

实际上,闭包在垃圾收集器中的工作方式与 javascript 中的任何其他对象没有什么不同。当没有人引用其中的任何内容时,垃圾收集器就可以自由地清理它。

在您的具体示例中,您立即调用的函数表达式会创建一个闭包,只要任何其他代码引用闭包中的某些内容,该闭包就会持续存在。因此,当database.insert()函数开始执行时,它会引用您的success()函数,并使闭包保持活动状态。当它完成并调用success()函数时,它可能会在调用它之后清除它对success()函数的引用,从而释放对闭包内某些东西的引用。如果垃圾收集器在该闭包中没有发现任何其他引用,它将释放该闭包。

于 2013-06-02T01:13:02.963 回答