js中有两大神兽,一个是原型对象,一个是闭包
进行一个小练习:点击某个按钮,提示“点击的是第几个按钮”; <button>测试1</button> <button>测试2</button> <button>测试3</button> <script type="text/javascript"> var btns=document.getElementsByTagName("button"); //获取到的元素是放在一个伪数组中; //第一种:遍历加监听; for(var i=0; i<btns.length;i++) //这样写,则需要每次去获取btns.length,下面的写法那就只需要获取一次btns.length; for(var i=0,length=btns.length; i<length; i++){ var btn =btns[i]; btn.onclick =function (){ alert('第'+(i+1)+'个'); } } //for循环执行完后,i=4了。而单击响应函数还没执行; //必须要单击才会执行,而此时i=4,则无法实现功能 //第二种: for(var i=0,length=btns.length; i<length; i++){ btns[i].index=i; //将数组btns的对应元素中分别保存一个下标index; btns[i].onclick =function (){ alert('第'+(this.index+1)+'个'); } } //给数组中每个元素一个对应索引值,依次给数组中每个元素绑定事件, //this.index+1为元素的对应索引值+1,就是对应的第几个 //遍历数组中的元素,分别给元素绑定事件; //第三种:利用闭包 for(var i=0,length=btns.length; i<length; i++){ (function (i){ btns[i].onclick=function(){ alert('第'+(i+1)+'个') } })(i); //立即执行函数 } //内部使用了外部的i,产生了对应的闭包,保存了对应的i值 //每次循环产生对应的闭包,闭包中保存了对应的值,单击触发用的是对应的i值。 </script>问题1:函数执行完后,函数内部声明的局部变量是否还存在 ?? 答:一般不存在,存在于闭包中的变量才可能存在;但如果让包含闭包的函数成为了一个垃圾对象,则会被释放,闭包中的变量也会不存在了; 如上题中,局部变量fn2()、fn3()被自动释放了,而局部变量a还存在;n2()产生闭包,a被保存在闭包Closure里 ,不会释放;
问题2.在函数外部能直接访问函数内部的局部变量吗?? 答:不能,但是我们可以通过闭包让外部操作它;
封装的js模块:
function my (){ //私有数据; var str="MY dog"; //操作数据的函数; function some(){ console.log("yes"+str); } function other(){ console.log("no"+str); } //向外暴露对象(将方法提供给外部使用) return { some:some, other:other } } <script type="text/javascript" src="../js/bibao.js"></script> //引入js模块 <script type="text/javascript"> var a=my(); //返回的内容赋给a,是一个对象 a.other(); //使用js模块中的方法 </script> //封装的js模块: (function my (){ var str="MY dog"; //私有数据; function some(){ console.log("yes"+str); } function other(){ console.log("no"+str); } window.bibao2={ //把要暴露的东西添加为window的属性; some:some, //在使用时,直接调用 other:other } })(); //匿名函数自调用(立即执行函数) //引入js模块 <script type="text/javascript" src="../js/bibao2.js"></script> <script type="text/javascript"> bibao2.some(); //window的属性可以直接使用; //这种方法更加直接,引入js文件后,就直接可以使用window的属性; </script>