具有匿名函数的变量和闭包范围

时间:2013-06-02 01:03:15

标签: javascript ajax closures

每当使用传递给它的a参数调用匿名函数时,这基本上将所有内容打包在匿名函数中,并且如果在从数据库调用第一个匿名函数之前调用另一个对订阅函数的调用,或者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​​ntaladded的调用都会调用我订阅的每个新的匿名函数,并关闭所有它自己的人员数据和垃圾收集清理所有的关闭?

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

1 个答案:

答案 0 :(得分:1)

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

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

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