本文共 2130 字,大约阅读时间需要 7 分钟。
因为 const 和 let 都以块(而非函数)为作用域,所以相比于使用 var ,使用这两个新关键字可能会更早地让垃圾回收程序介入,尽早回收应该回收的内存。在块作用域比函数作用域更早终止的情况下,这就有可能发生。
如
function Article() { this.title = 'Inauguration Ceremony Features Kazoo Band';}let a1 = new Article();let a2 = new Article();a2.author = 'Jake';
function Article(opt_author) { this.title = 'Inauguration Ceremony Features Kazoo Band'; this.author = opt_author;}let a1 = new Article();let a2 = new Article('Jake');
function Article() { this.title = 'Inauguration Ceremony Features Kazoo Band'; this.author = 'Jake';}let a1 = new Article();let a2 = new Article();// 共享一个隐藏类,这样,两个实例基本上就一样了(不考虑 hasOwnProperty 的返回值)delete a1.author;// 使用 delete 关键字会导致生成相同的隐藏类片段,既不再共享一个隐藏类// 在代码结束后,即使两个实例使用了同一个构造函数,它们也不再共享一个隐藏类。// 动态删除属性与动态添属性导致的后果一样。a1.author=null// 最佳实践是把不想要的属性设置为 null 。这样可以保持隐藏类不变和继续共享,// 同时也能达到删除引用值供垃圾回收程序回收的效果。
function setName() { name = 'Jake'; }
let name = 'Jake';setInterval(() => { console.log(name);}, 100);
只要定时器一直运行,回调函数中引用的 name 就会一直占用内存。垃圾回收程序当然知道这一点,因而就不会清理外部变量。使用JavaScript闭包很容易在不知不觉间造成内存泄漏。
let outer = function () { let name = 'Jake'; return function () { return name; };};
注意 静态分配是优化的一种极端形式。如果你的应用程序被垃圾回收严重地拖了后腿,可以利用它提升性能。但这种情况并不多见。大多数情况下,这都属于过早优化,因此不用考虑。
转载地址:http://ydqii.baihongyu.com/