需要明白 JS 里面的变量范围, 闭包解决的一个基本问题也是变量范围!
1. 在全局下面直接 var i = 1; 就属于全局变量, 全局变量可以在整个 window 范围内是可见的;
2. 在闭包里面 var c = 1; 就只有闭包内部可见;
3. 注意在哪里都行, 如果声明变量的时候不加 var 的话, 就是全局变量了;
4. 也就是回答你这个问题的答案, 闭包让这些变量的值始终保持在内存中 。 下面是个例子:
function funcOut(){
		var n=1;
		// 注意: 没加 var , 全局可以访问
		funcAdd=function(){
			n+=1; 
		}
		function funcIn(){
			alert(n);
		}
		return funcIn;
	}
	var result=funcOut();
	result(); // 1
	funcAdd(); // 始终保持在内存中哦。
	result(); // 2
	funcAdd(); // 始终保持在内存中哦。
	result(); // 3顺便说下面这种写法 js 里面是允许的, 至于全局变量为什么不好呢? 在做开发的时候, 应该尽量避免全局变量, 涉及到设计模式, 还有一些最佳实践, 可以 Google 下更多资料:
undefined = true;
把下面的两段代码写个 test.html 页面做加深印象.
看下这个很有名气的循环问题
function addLinks () {
    for (var i=0, link; i<5; i++) {
        link = document.createElement("a");
        link.innerHTML = "Link " + i + "<br>";
        link.onclick = function () {
            alert(i);       // 都为 5 
        };
        document.body.appendChild(link);
    }
}
window.onload = addLinks;// 这样写的话就可以解决问题了
function addLinks () {
    for (var i=0, link; i<5; i++) {
        link = document.createElement("a");
        link.innerHTML = "Link " + i + "<br>";
        link.onclick = function (num) {
            return function () {
                alert(num);  // num 保存着这一块的值, 在内存里面
            };
        }(i);  // 注意这里的 "();" 是函数直接就执行了, 然后把 i 作为参数进去
        document.body.appendChild(link);
    }
}
window.onload = addLinks;