闭包
闭包是一个拥有许多变量和绑定了这些变量的环境的表达式(通常是一个函数),因而这些变量也是该表达式的一部分;。可以理解为所有的JavaScript函数都是属于闭包。
闭包的作用:
①:封装变量,把一些不需要暴露的全局变量封装在成局部变量;
②:延长局部变量的寿命;
例子:
var Obj=function(){ var i=0; var fun=function(){ i++; console.log(i); } return fun; } var obj=new Obj(); var _obj=new Obj(); obj();//输出1 obj();//输出2 _obj();//输出1 _obj();//输出2
<!DOCTYPE html> <html lang="ch-en"> <head> <meta charset="UTF-8"> <title>闭包</title> </head> <body> <ul> <li>1</li> <li>2</li> <li>3</li> <li>4</li> <li>5</li> </ul> <script> var li=document.getElementsByTagName('li'); for(var i=0;i<li.length;i++){ (function(i){ li[i].onclick=function(){ console.log(i+1); } })(i); } </script> </body> </html>
用闭包的方式实现的功能用面向对象的方式也可以实现,反之亦然;
用面向对象的方法实现一个命令模式的例子;
<!DOCTYPE html> <html lang="ch-en"> <head> <meta charset="UTF-8"> <title>闭包</title> </head> <body> <button id="open">open</button> <button id="close">close</button> <script> //创建一个电视机对象,该对象有2个功能,打开和关闭功能 var Tv={ 'open':function(){ console.log('你点击了open按钮'); }, 'close':function(){ console.log('你点击了close按钮'); } } // 创建一个命令对象,参数是要被命令的对象 var OpenAndCloseTv=function(obj){ this.obj=obj; }; //给命令对象添加一个打开电视的命令,该命令将调用对象的打开功能; OpenAndCloseTv.prototype.execute=function(){ this.obj.open(); } //给命令对象添加一个关闭电视的命令,该命令将调用对象的关闭功能; OpenAndCloseTv.prototype.undo=function(){ this.obj.close(); } // 创建一个绑定事件对象,参数是命令对象 var setEvent=function(command){ document.getElementById('open').onclick=function(){ command.execute(); } document.getElementById('close').onclick=function(){ command.undo(); } } // 开始绑定事件 setEvent(new OpenAndCloseTv(Tv)); </script> </body> </html>

浙公网安备 33010602011771号