测试代码如下:
<html> <script> var count = 0; var number = 1000; for (var i = 0; i < 900; i++) { var buggyObject = { callAgain: function() { var ref = this; var val = setTimeout(function() { ref.callAgain(); var newArray = new Array(); if( count > 3) number = 10000; for( var a = 0; a < number; a++) newArray[a] = a; console.log("called"); count++; }, 1000); // end of val declaration } // end of call again } // end of object declaration } buggyObject.callAgain(); </script> </html>
garbage collection能够生效的原因是因为在每次timer trigger并且执行完毕后,当前execution environment里的局部变量newArray 引用计数为0,因此可以被回收:如果将该定义成局部变量的array改成全局变量,则GC不会再发生:
<html> <script> var count = 0; var number = 1000; var globalArray = []; for (var i = 0; i < 900; i++) { var buggyObject = { callAgain: function() { var ref = this; var val = setTimeout(function() { ref.callAgain(); if( count > 3) number = 10000; for( var a = 0; a < number; a++) globalArray.push(a); console.log("called"); count++; }, 1000); // end of val declaration } // end of call again } // end of object declaration } buggyObject.callAgain(); </script> </html>