- 全局变量
- 当一个变量被定义在全局作用域中,默认情况下
JAVASCRIPT
引擎就不会将其回收销毁。如此该变量就会一直存在于老生代堆内存中,直到页面被关闭。
- 全局变量
缺点。
- 使变量不易被回收。
- 多人协作时容易产生混淆。
- 在作用域链中容易被干扰。
- 可以通过包装函数来处理全局变量
。
- 局部变量。
- 尽量选用局部变量而不是全局变量。
- 局部变量的访问速度要比全局变量的访问速度更快,因为全局变量其实是
window
对象的成员,而局部变量是放在函数的栈里的。
- 手工解除变量引用
- 在业务代码中,一个变量已经确定不再需要了,那么就可以手工解除变量引用,以使其被回收。
var data = { /* some big data */ };
// ...
data = null;
- 变量查找优化。
- 变量声明带上
var
,如果声明变量忘记了var
,那么JAVASCRIPT
引擎将会遍历整个作用域查找这个变量,结果不管找到与否,都会造成性能损耗。
- 如果在上级作用域找到了这个变量,上级作用域变量的内容将被无声的改写,导致莫名奇妙的错误发生。
- 如果在上级作用域没有找到该变量,这个变量将自动被声明为全局变量,然而却都找不到这个全局变量的定义。
- 慎用全局变量。
- 全局变量需要搜索更长的作用域链。
- 全局变量的生命周期比局部变量长,不利于内存释放。
- 过多的全局变量容易造成混淆,增大产生bug的可能性。
>
- 具有相同作用域变量通过一个var声明。
jQuery.extend = jQuery.fn.extend = function () {
var options,
name,
src,
copy,
copyIsArray,
clone,target = arguments[0] || {},
i = 1,
length = arguments.length,
deep = false ;
}
- 缓存重复使用的全局变量。
- 全局变量要比局部变量需要搜索的作用域长
- 重复调用的方法也可以通过局部缓存来提速
- 该项优化在IE上体现比较明显
var docElem = window.document.documentElement,
selector_hasDuplicate,
matches = docElem.webkitMatchesSelector || docElem.mozMatchesSelector || docElem.oMatchesSelector ||docElem.msMatchesSelector,
selector_sortOrder = function ( a, b ) {
// Flag for duplicate removal
if ( a === b ) {
selector_hasDuplicate = true ;
return 0;
}
}
- 善用回调。
- 除了使用闭包进行内部变量访问,我们还可以使用现在十分流行的回调函数来进行业务处理。
function getData(callback) {
var data = 'some big data';
getData(function(err, data) {
console.log(data);
});
- 回调函数是一种后续传递风格(`Continuation Passing Style`, `CPS`)的技术,这种风格的程序编写将函数的业务重点从返回值转移到回调函数中去。而且其相比闭包的好处也有很多。
- 如果传入的参数是基础类型(如字符串、数值),回调函数中传入的形参就会是复制值,业务代码使用完毕以后,更容易被回收。
- 通过回调,我们除了可以完成同步的请求外,还可以用在异步编程中,这也就是现在非常流行的一种编写风格。
- 回调函数自身通常也是临时的匿名函数,一旦请求函数执行完毕,回调函数自身的引用就会被解除,自身也得到回收。