JavaScript 是怎么执行的?
JavaScript 是一种解释型语言,与编译型语言不同,如 C / C++ 是直接将源代码编译为机器语言,再由机器运行机器码(二进制)。
而解释型语言是将源代码翻译为中间代码,再由解释器对中间代码进行解释运行。
对 JavaScript 来说,它的解释器就是浏览器,更准确的说,是浏览器中的 JavaScript 引擎,如大名鼎鼎的 Chrome V8。
如何提高 JavaScript 的执行速度?
内存管理
什么是 GC ?
不再被活跃对象引用的对象即为垃圾。根对象被定义为活跃对象,如浏览器对象、dom对象,被它们引用的对象即为活跃对象。
简单的来说,就是不再能被程序访问到的对象,就是可以回收的垃圾了。
** 事实上因为某些老旧 IE 浏览器的机制,不再被活跃对象引用,但是互相循环引用的对象无法正常被被 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 中虽然闭包结束了,但是外部仍有活跃对象在引用它,所以它将常驻内存而不被回收,这就是闭包的用处之一。
下班了,下周来了继续写。