闭包

闭包(Closure)

自调函数

  • 使用

      (function(){
      })();
    
      <script>	
      	function demo(){
      		var m=100;
      		function fn(){
      			console.log(m);
      		}
      		return fn;
      	}
      	var f=demo();
      	f();
      </script>
    
  • 注意

  • 可以正常使用参数

  • 自调函数后加语句结束符(😉

  • 用处

  • 产生局部的作用域 避免全局变量

  • JS的模块化

方法1

	<script>
		(function(){
			var lis=document.querySelectorAll("ul li");
			function demo(a){
				return function(){
					alert(a);
				}
			}
			for(var i=0;i<lis.length;i++){
				lis[i].onclick=demo(i);
			}
		})()
	</script>

方法2

<script>
	(function(){
		var lis=document.querySelectorAll("ul li");
		for(var i=0;i<lis.length;i++){
			lis[i].onclick=(function(m){
				return function(){
					alert(m);
				}
			})(i);
		}
	})()
</script>

方法3

<script>
	(function(){
		var lis=document.querySelectorAll("ul li");

		for(var i=0;i<lis.length;i++){
			(function(i){
				lis[i].onclick=function(){
					alert(i);
				}
			})(i)
		}
	})()
</script>

闭包

  • 能够读取其他作用域变量的函数 就是闭包

闭包的作用

  • 读取函数内部的变量
  • 让这些变量的值始终存在内存中

闭包缺点

  • 导致函数中的变量的保存在内存中(IE中容易造成内存泄漏),增大开销

原型和原型链

原型

  • 每一个对象都有原型(原型也是一个对象)
  • 对象可以从其他原型继承属性和方法
  • 属性 proto(对象的方法)
  • 属性 prototype(对象的构造函数的方法)

原型链

  • 对象的原型还有原型
  • 一直到null
posted @ 2017-09-28 19:05  不完美的完美  阅读(115)  评论(0编辑  收藏  举报