javascript设计模式4闭包

何为闭包?

  闭包的本质在于函数的变量作用域。正由于函数体内变量作用域的生存周期形成了闭包环境。

如何实现闭包?

  以命令模式为例,命令模式的意图是封装请求为对象,从而分离请求的发起者和请求的接收者之间的耦合关系。命令执行之前,可以预先在命令对象中植入命令的接收者。

  

var tv = {
	open : function(){
		console.log("open tv")
	},
	close: funtion(){
		console.log(" close tv")
	}
}

var createCommand = function(receiver){
	var execute = function(){
		return receiver.open();
	}
	var undo = function(){
		return receiver.close();
	}
	return {
		execute:execute,
		undo:undo
	}
}

setCommand(createCommand(tv));

  

闭包和内存管理?

  当使用闭包的时候,局部变量本来应该在函数退出的时候被解除引用,但是如果局部变量被封装在了闭包形成的环境中,那么这个局部变量就能一直生存下去。那么这种情况算不算一种内存泄露?

  实际上,当我们使用闭包的时候,一般都是我们选择主动把一些变量封装到闭包中,因为以后可能还需要用到此变量。对于这些变量,放到闭包中和放到全局变量中对内存影响是一致的。并不能说是一种内存泄露。

  再者如果我们需要回收这些变量,可以手动将这些变量设置为null。

  使用闭包的同时比较容易形成循环引用,如果闭包的作用域链中保存着一些dom节点,这时候就有可能造成内存泄露。但这本身并非闭包的问题,也非js的问题。

posted @ 2016-02-17 09:49  倾其一生  阅读(100)  评论(0)    收藏  举报