JavaScript闭包

120 阅读1分钟

1.1 闭包定义

函数的AO通过scope chain相互连接起来,使得函数体内的变量都可以保存在函数的AO,这样的特性称为“闭包”。

1.2 闭包举例

1.2.1 代码

function outer(){ 
  var scope = 'outer'; 
  function inner(){ 
    return scope; 
  } 
return inner; 
} 
var fn = outer(); 
console.log(fn()); // outer

1.2.2 分析

image.png

  • 紫色部分:运行结束由于fn指向了innerinner拿着scope chain2的拷贝、所以outer的AO没有释放

1.2 闭包的用途

1.2.1 实现公有变量,例如:累加器

   function add(){
    	var count = 0;
    	function addAction(){
    		count++;
    		console.log(count);
    		return count;
    	}
    	return addAction;
   }
   var myAdd = add();
   myAdd();
   myAdd();
   myAdd();

1.2.2 缓存存储结构

function add(){
	var count = 0;
	function addAction(){
		count++;
		console.log(count);
		return count;
	}
	function clearAction(){
		count = 0;
		console.log(count);
		return count;
	}

	return [addAction, clearAction];
}

var myAdd = add();
myAdd[0]();
myAdd[0]();
myAdd[0]();
myAdd[0]();
myAdd[1]();
myAdd[0]();
myAdd[0]();

1.2.3 封装,使用方法操作变量,实现属性私有化

function counter(){
	var count = 0;
	var adder = {
		addAction: function(){
			count++;
			console.log(count);
			return count;
		},
		clearCount: function(){
			count = 0;
			console.log(count);
			return count;
		}
	};
	return adder;
}
var myCounter = counter();
myCounter.addAction();
myCounter.addAction();
myCounter.addAction();
myCounter.addAction();
myCounter.clearCount();
myCounter.addAction();
myCounter.addAction();

1.3 闭包的缺点

  • 闭包会造成原有的AO不释放,产生内存泄漏(非正规的内存占用)