JavaScript 性能优化, 内存管理篇 (一)

JavaScript 是怎么执行的?

JavaScript 是一种解释型语言,与编译型语言不同,如 C / C++ 是直接将源代码编译为机器语言,再由机器运行机器码(二进制)。

而解释型语言是将源代码翻译为中间代码,再由解释器对中间代码进行解释运行。

对 JavaScript 来说,它的解释器就是浏览器,更准确的说,是浏览器中的 JavaScript 引擎,如大名鼎鼎的 Chrome V8。


如何提高 JavaScript 的执行速度?

解释型语言的运行环境直接制约了它上面的程序的运行速度,于是我们先从这方面着手,来想办法提高 JavaScript 的性能。

内存管理

不同 C / C++ , JavaScript 不允许程序员在代码中手动操作释放内存,所以程序的内存管理依赖于 V8 (下文皆以 V8 为例)的 GC 。
V8 会不时的进行 GC,检测程序不再使用的对象,并释放其占用的内存,该过程可能造成程序短暂的停顿。

什么是 GC ?

GC 即为 Garbage Collection,垃圾回收机制。指程序自动的回收并释放那些不再使用的内存的行为。

GC 怎么识别垃圾?

不再被活跃对象引用的对象即为垃圾。根对象被定义为活跃对象,如浏览器对象、dom对象,被它们引用的对象即为活跃对象。

简单的来说,就是不再能被程序访问到的对象,就是可以回收的垃圾了。

** 事实上因为某些老旧 IE 浏览器的机制,不再被活跃对象引用,但是互相循环引用的对象无法正常被被 GC 回收,将会造成内存泄漏。 **


(事实上 GC 的机制很复杂,我将单独开篇来详细解释 V8 的 GC  机制,这里就不详讲了。)

有了对 GC 大概的了解,我们应该明白仍然不能肆无忌惮的使用内存并把一切都交给 GC,因为它也无法智能的识别出所有程序不再使用的对象,一些糟糕的代码仍然能够造成内存泄漏。

一些良好的代码习惯如下:


不要使用全局变量

除非你是要写插件或者框架,否则千万不要轻易使用全局变量。

原因如上所说,全局变量在浏览器内始终是活跃对象,无法被 GC 回收,而且污染了命名空间。

推荐使用“立即执行的匿名函数”这种模式来编写自己的代码,如:

(function(){
  //do something
})();
甚至可以:

(function($, document, window){
  //do something
})(jQuery, document, window);
匿名函数将在执行完毕后被销毁,不会占用内存。


手动解除变量的引用

在代码中手动将那些不再使用的对象解除引用,尤其是一些大对象。

比如你的一个项目中需要用到大量的缓存:

var cache = {};
cache.count = 0;
var setCache = function (key, value) {
  if (count > 50) {
    cache.data = null;
    cache.count = 0;
  }
  cache.data[key] = value;
};
var getCache = function (key) {
  cache.count++;
  return cache.data[key];
}

你就可以在缓存达到一定数目时解除引用来清理之前的缓存。当然这只是个简单的例子。

** 如果要用于 IE 浏览器,你还需要注意解除循环引用和dom的引用,这都会在 IE 中造成内存泄漏 **


合理的使用闭包

什么是闭包?

说白了闭包就是一个代码块,拥有自己私有的作用域,在这里面定义的变量外界无法直接访问。在 JavaScript 中每一个 function 都是一个闭包。

比如我想要一个计数器方法:

var fa = function () {
  var count = 0;
  return count++;
};

var fb = (function () {
  var count = 0;
  return function () {
    return count++;
  }
})();

然后我写出了 fa 和 fb ,这2个方法。但是显然调用 fa 却无法得到我们预期的结果,原因就是 fa 这个闭包结束后没有外界活跃对象继续引用内部的 count 对象了,

于是它就被清理掉了。而 fb 中虽然闭包结束了,但是外部仍有活跃对象在引用它,所以它将常驻内存而不被回收,这就是闭包的用处之一。


下班了,下周来了继续写。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值