5 楼:{ var tmp = 2 } JS 中语句块不能独立作用域,这样写等同于声明了一个全局变量 tmp = 2,所以不存在该语句块内代码执行完毕后 tmp 就被销毁的情况。
6 楼:
变量 add,以及 add 的 count 属性、plus() 方法都是公共的,这意味着其他代码可以直接修改你的 count 属性,造成不必要的麻烦。
闭包要解决的问题是:一个函数可以拥有私有变量,并且外部可以通过闭包访问该私有变量,如特权方法(类似 JavaBean 的写法)。
针对以上言论,需要反驳一下。
6 楼:变量 add,以及 add 的 count 属性、plus() 方法都是公共的,这意味着其他代码可以直接修改你的 count 属性,造成不必要的麻烦。
这句话,本身就存在问题,6楼是使用new构造了一个object,并且再对object的属性和方法进行赋值,后面直接onclick 调object.method()就行了,所谓的方法都是公开的,这个的确,但是要知道纵使是公开的,也必须使用这个对象访问或者修改才行,而不是所谓的直接可以修改。
var count;
var myObj=new Object;
myObj.count=2; //这里的myObj.count与上面声明的count可不是一个东西。
另外:
<script>
function Student(value) {
var name = value;
this.getName = function() { return name; };
this.setName = function(value) {name = value; };
}
<script>
以上代码,难道不觉得很像是在声明一个对象?并且为了使用所谓的 function 的闭包,还非得使用下 this 关键词,到最后还需要使用 new 构造下 Student,并且为了保证能对该函数的私有变量 name 赋值,还搞了个函数的变量传过去,用起来真的是非常别扭,并且,这个方法好像在全局也都可以通过 Student 来访问吧?
<script>
function Student(value) {
var name = value;
this.getName = function() { return name; };
this.setName = function(value) {name = value; };
}
myStu=new Student("name");
//我是不是可以在script内任意一个地方通过myStu.setName("name")来修改name值?
<script>
所以,其实核心的需求就是,我可以搞一个局部的变量,并且这个变量的生命周期还必须是类全局性质的,但又需要与全局变量区分开,那就直接用对象咯,声明一个对象,再定义下这个对象的某个属性值,那这个属性值变量本来就必须通过这个对象来访问,也即已经达到了将这个变量限制在这个对象的范围内。
这个时候,又何必多次一举,非得使用所谓的闭包,更何况,你不觉得如果把一个函数定义为一个对象的方法,本身就已经是一种闭包了吗?为啥还非得用 function 达到?
发表评论 取消回复