闭包的原理小结

版权声明:如需转载相关文章,望告知后注明出处,若触及本人权益必究! https://blog.csdn.net/kevinx610/article/details/86366846

在理解闭包原理之前,首先要来回顾一下作用域的相关知识点。

作用域和闭包

全局作用域和局部作用域的特点

  • 全局作用域有命名冲突,声明多个同名变量,会互相覆盖。
  • 函数内部的变量在函数被调用后,会被垃圾回收机制销毁,第二次调用函数变量值可能不同。
  • 函数级别作用域(局部作用域)不存在命名冲突,即使多个函数内部声明同一个变量,也不会互相覆盖。

闭包的原理

  • 使用局部作用域(函数内部声明变量),防止命名冲突(全局变量污染)。
  • 父函数的内部声明一个子函数去使用父函数中的变量,防止变量被回收。
  • 父函数return 这个子函数,然后使用变量去接收return的子函数,让其他函数可以读取其内部的变量,但是不能修改。

闭包的作用

闭包的作用实际上就是保存自己私有的变量,通过提供的接口(方法)给外部使用,但外部不能直接访问该变量。

使用案例来详细说明:

// 声明一个全局作用域
var num1 = 1;  
function a1() {
	// 声明1个局部作用域
	var num2 = 2;  
	function a2(){
		// 声明1个局部作用域
		var num3 = 3; 
		// 返回 num2 + num3 的和 
		return num2 + num3;  
	}
	// 返回 a2 这个函数,实际就是 num2 + num3 的和
	return a2;  
}
// 使用变量接收 a1的返回值 a2函数,实际num2 + num3 的和
var num4 = a1();  
// 控制台输出 num4的调用,实际是 num2 + num3 的和
console.log(num4());  

上面的案例中,首先声明了一个全局变量 num1,紧接着声明函数a1,a1中声明局部变量 num2,然后又声明一个内部函数a2,同时a2中也声明了一个局部变量num3。
现在一共有3个作用域, 全局作用域,a1作用域,a2作用域。a2函数要使用num2首先在自己内部查找,如果没找到就去父函数a1的作用域中查找,假如父函数a1没有就到全局作用域中查找,直到找到为止,这样就形成了作用域链。

注意:如果函数内部的变量在声明时没有使用 var ,这个变量就会提升为全局变量。

猜你喜欢

转载自blog.csdn.net/kevinx610/article/details/86366846