再谈javascript中的闭包

最近在看书学习的过程当中,又碰到了闭包这个知识点,发现本身对于闭包的理解错了。javascript

 

仍是先看一段代码,清晰地展现了闭包:java

function foo(){
	var a =2;
	function bar(){
		console.log(a);
	}
	return bar;
}
var baz = foo();
baz(); 		//2   这就是闭包

解释:函数bar()的词法做用域可以访问到foo()的内部做用域,而后咱们将函数bar()自己当作一个值类型进行传递出去了,在foo()执行后,其返回值(就是函数baz())复制给了变量baz并调用了baz(),实际上就是执行了内部函数bar(),可是函数bar()是在本身定义的词法做用域以外的地方执行了。闭包

在一般的状况下,函数foo()在执行完以后,整个内部做用域都会被垃圾回收机制回收并销毁的,可是由于闭包的存在,foo()的内部做用域并无被销毁,由于函数bar()自己在使用内部做用域并持有对该做用域的引用,这个引用就是闭包了。异步

 

再来看看闭包的代码:函数

function foo(){
	var a =2;
	function baz(){
		console.log(a);		//2
	}
	bar(baz);
}

function bar(fn){
	fn();	//我就是闭包啦
}

也能够间接地传递:学习

var fn;
function foo(){
	var a =2;
	function bar(){
		console.log(a);
	}
	fn = bar;
}

function baz(){
	fn(); 	//我就是闭包啦
}

foo();
baz();	//2

 

闭包的做用?spa

函数是能够记住并访问被定义时所在的词法做用域的,当函数在词法做用域以外执行的时候,这时就产生了闭包。blog

当理解了这个概念,再回头看我写过的代码,就很容易发现闭包的影子,包括:定时器、事件监听器、AJAX请求或者其余异步任务中,只要是用了回调函数,实际上都是在使用闭包。事件

 

以上是我对闭包的一些浅见,若有错误欢迎你们指出:)ip

 

参考资料:《你不知道的JavaScript》

相关文章
相关标签/搜索