pcoll=document.querySelectorAll("p") plist=document.getElementsByTagName("p")
以上 pcoll 返回的就是固定的值。
而获取 plist 后, 若 html 页面有变化且刚好添加或移除了 p 标签, 此时plist也会跟着变。
使用 addEventListener的时候,有无法使用,是因为:
x = document.getElementById("myBt"); // x ---> null
可以这么写:
window.onload = function () { var x = document.getElementById("myBt"); x.addEventListener("click", myFunction); };
针对 5楼、6楼 的一些错误进行指明:
5楼:{ var tmp = 2 } JS 中语句块不能独立作用域,这样写等同于声明了一个全局变量 tmp = 2,所以不存在该语句块内代码执行完毕后 tmp 就被销毁的情况。
6楼:变量 add,以及 add 的 count 属性、plus() 方法都是公共的,这意味着其他代码可以直接修改你的 count 属性,造成不必要的麻烦
闭包要解决的问题是:一个函数可以拥有私有变量,并且外部可以通过闭包访问该私有变量,如特权方法(类似 JavaBean 的写法):
<script> function Student(value) { var name = value; this.getName = function() { return name; }; this.setName = function(value) {name = value; }; } <script>
5楼说的太对了,这个 bug 用着真不痛快,针对这个例子写了点代码:
局部变量计数。
<button type="button" onclick="myFunction()">计数!</button> <p id="demo">0</p> <script> var add = new Object(); add.count = 0; add.plus = function() { this.count++; } function myFunction(){ add.plus(); document.getElementById("demo").innerHTML = add.count; } </script>
尝试一下 »
感觉可以用正常的手段解决这类问题了。
闭包就是个bug。我相信作者在写javascript的时候都没想到用户会这么用。
闭包其实是利用了一个变量退出作用域的时候,暂时没有被销毁,它的值还在,如果后面有变量也叫这个名字,那这个数据会被重新利用起来。你会发现,后面你使用的这个名字一样的变量是有初值的。下面的例子可以看出问题来。
<p>局部变量计数。</p> <button type="button" onclick="myFunction()">计数!</button> <p id="demo">0</p> <script> { var tmp = 2; //理论上在退出语句块后,这个变量要被释放掉的。包括内存可能被回收。但事实并非如此,会影响后面和他同名的变量 } var add = (function () { //var counter = 0; //这里注释掉.其实和上面的tmp一样的道理。这里在函数自己执行完后就应该销毁了的。 //return function () {return counter += 1;} //这里的counter已经不是上面的counter了,是一个全局变量。有初值,受上面影响,初值为0 return function () {return tmp += 1;} //这里tmp就是个全局变量。它是有初值的。为上面的2 })(); function myFunction(){ document.getElementById("demo").innerHTML = add();//3 document.getElementById("demo").innerHTML = add();//4 document.getElementById("demo").innerHTML = add(); //5 } </script>
执行上面的代码可以看的很清楚。计数器一样正常工作。
所以,闭包就是利用了个bug: 退出作用域的变量不会立即销毁。会影响后面的同名变量。
但不知道后面的javascript版本会不会修改这种机制。
所以代码这么写是不可靠的。太依赖于javascript的内部实现了。
其实要实现全局计数器的需求。正常的做法是:
定义一个全局对象。这个对象定义自己的属性和方法add。
用的时候 对象.add 就可以了。这个才正常。
上面用闭包的方式太过巧妙,给人的感觉就是在夹缝中求生存。用起来也不舒服吧。
感谢您的支持,我会继续努力的!
支付宝扫一扫,即可进行扫码打赏哦
540NodeList对象
以上 pcoll 返回的就是固定的值。
而获取 plist 后, 若 html 页面有变化且刚好添加或移除了 p 标签, 此时plist也会跟着变。
539DOMEventListener
使用 addEventListener的时候,有无法使用,是因为:
可以这么写:
538JavaScript闭包
针对 5楼、6楼 的一些错误进行指明:
5楼:{ var tmp = 2 } JS 中语句块不能独立作用域,这样写等同于声明了一个全局变量 tmp = 2,所以不存在该语句块内代码执行完毕后 tmp 就被销毁的情况。
6楼:变量 add,以及 add 的 count 属性、plus() 方法都是公共的,这意味着其他代码可以直接修改你的 count 属性,造成不必要的麻烦
闭包要解决的问题是:一个函数可以拥有私有变量,并且外部可以通过闭包访问该私有变量,如特权方法(类似 JavaBean 的写法):
537JavaScript闭包
5楼说的太对了,这个 bug 用着真不痛快,针对这个例子写了点代码:
局部变量计数。
尝试一下 »
感觉可以用正常的手段解决这类问题了。
536JavaScript闭包
闭包就是个bug。我相信作者在写javascript的时候都没想到用户会这么用。
闭包其实是利用了一个变量退出作用域的时候,暂时没有被销毁,它的值还在,如果后面有变量也叫这个名字,那这个数据会被重新利用起来。你会发现,后面你使用的这个名字一样的变量是有初值的。下面的例子可以看出问题来。
尝试一下 »
执行上面的代码可以看的很清楚。计数器一样正常工作。
所以,闭包就是利用了个bug: 退出作用域的变量不会立即销毁。会影响后面的同名变量。
但不知道后面的javascript版本会不会修改这种机制。
所以代码这么写是不可靠的。太依赖于javascript的内部实现了。
其实要实现全局计数器的需求。正常的做法是:
定义一个全局对象。这个对象定义自己的属性和方法add。
用的时候 对象.add 就可以了。这个才正常。
上面用闭包的方式太过巧妙,给人的感觉就是在夹缝中求生存。用起来也不舒服吧。