JS闭包 与 静态私有变量

JS闭包 与 静态私有变量

近期因为面试原因,又重新复习了一下 闭包,于是逛了各大社区,看了各种JS书籍对闭包的定义和举例,这过程中发现一个很有意思的东西:静态私有变量,所以在这里把一些心得和总结和大家分享一下,下面直接上代码

 var Person = (function (){
     
 		// 静态私有变量
		var num = 0
		// 静态私有方法
		function() {
     
			// ...
		}

		return function (){
     
			var num2 = 0
			num++
			num2++
			return num + ',' + num2
		}
	})()
	Person.prototype = {
     
		// 静态公有属性
		name: 'shimh',
		// 静态公有方法
		fun2:function(){
     
		}	
	}
	console.log(Person()) // 1,1
	console.log(Person()) // 2,1
	console.log(Person()) // 3,1

看,上面代码连续执行了3次Person函数,return的函数中num2 连续初始化了3次,而Person下的num变量在这个调用的函数内部,但是却只初始化了一次,这就是静态私有变量的神奇之处,静态私有变量 需要符合以下条件:

1.此变量是私有变量,不能从函数外部直接访问
2.此变量只初始化一次,当函数再次调用时,不再重新初始化变量(因为num初始化的次数取决于外部函数被存入 var Person 变量的次数,而不是调用Person的次数)

为了方便理解,我给函数还定义了prototype属性(静态公有属性、静态公有方法),他们就是静态的,但他们是公有的,他们通过new关键字实例化对象后就可以访问到,所以他们是公有的,但是每次实例化对象的时候,他们都不会重新加载,只是将指针同时指向新的对象以供调用

实现 闭包静态私有变量 环境方法也许会有很多种,通常要同时满足以下代码结构:

	var Person = (function(){
     
		var symbol
		return function () {
     
			// ...
		}
	})()

1.外部定义一个变量以供直接调用
2.变量内是一个立即执行函数 (function(){ … })()
3.使用 return 关键字执行闭包内的函数

还有一种定义私有变量闭包的形式,那就是不使用变量定义的方式,外部直接写一个普通函数的嵌套,内部的return还是一样的

	function Person() {
     	// 这里是区别
		var num = 0
		return function() {
     
			num ++ 
			return num
		}
	}

	var per = Person() // 关键一步
	
	cosnole.log(per()) // 1
	cosnole.log(per()) // 2
	cosnole.log(per()) // 3

如果使用直接定义函数的方式写闭包,那么在调用之前也需要var初始化一次闭包,否则return内的函数不能被正常调用,而是直接输出return下的函数体,这显然不是我们想要的。

这种比上面的更好理解一点,由于我们用var初始化了一次这个函数,所以num只调用了一次,如果初始化多次,那么num也会被初始化多次,所以num初始化的次数,取决于上面var对闭包函数Person定义的次数。

以上就是我对 静态私有变量 的理解,希望能帮到看帖的你,如果又大神能够指出一些问题请给我留言,在下感激不尽!

你可能感兴趣的:(javaScript基础,JS,静态私有变量,闭包)