闭包是调用私有属性的接口。作为一个一直学习C++的程序员,看到这个立即热泪盈眶。

好吧,但在此看到这里爆发的争论,我希望提一点:闭包是实现面向对象所必须的。

实际上,11楼根本未能理解闭包,甚至未能理解面向对象的含义。面向对象的基本要素是封装性:也许我们需要private的变量,也就是不能够直接改变只能借由方法改变的属性。而所谓“用对象就能取代闭包”,但是闭包实际上真正的意义应当用在对象构造器中的。

比如,我们希望对象有一个属性,只允许增加不许减少,而且每次只能用add函数给它加上某个偶数。这时闭包就体现了其用处。这个例子可以说是比较统一的解决了上面所提出的所有问题。

function NumPro(val){

    var counter=val;

    this.add=function(num){

        if(num%2==0) counter+=num;

    }

    this.num=function(){

        return counter;

    }

}

//alert(counter);      //报错

alert(NumPro.counter); //输出undefined(显而易见的)

var a=new NumPro(0);

alert(a.counter);      //输出undefined(不在this中)

alert(a.num());        //输出0

a.add(2);

alert(a.num());        //输出2

a.add(1);

alert(a.num());        //输出2(仅允许偶数)

a.add(10);

alert(a.num());        //输出12

var b=new NumPro(-2);

alert(b.num());        //输出-2

显然,闭包并不仅仅是由于“作用域中的变量不会销毁”——直接输出变量会直接报错,也不能通过函数名访问属性;在两个对象中所输出的值没有任何关系。同时,它又能限制对属性的直接操作——不在this中的变量无法从外部访问。

因此,闭包是被设计好的,并不是一个bug。实际上,如果接触过Java或其它面向对象语言会有很深的感触——Javascript 的面向对象往往出人意料(它甚至没有Class)。但这不意味着它不能实现其它语言中的private效果。这样看,此处的闭包仅仅是把this.counter=num改成var counter=num而已。

当然,闭包不完全是如此,比如正文中返回一个函数(名)的巧妙方法。不过,闭包意味着函数中的私有变量不会立即销毁,可被内嵌的函数访问。这就足够了。

另外,实验证明函数不仅仅可访问上一层函数的私有变量——父函数的父函数,以及更上层函数的变量都可访问(但不推荐这样做……这似乎往往只是降低代码可读性)。但是,如果使用:

NumPro.prototype.numEx=function(){

    return counter;

}

如果counter是NumPro函数内定义的,这个函数使用后将会报错(它的原型函数显然不含有counter变量,即使含有也不清楚如何处理)。

点赞(0) 打赏

评论列表 共有 0 条评论

暂无评论

热门产品

触发修改文章时间【fastadmincms开发记录】|fastadmincms二次开发,触发,修改,文章,时间,fastadmin,ms,开发,记录
触发修改文章时间【fastadmincms开发记录】
在tp5中过滤输入的零宽度字符【fastadmincms开发记录】|fastadmincms二次开发,在tp5中,过滤,输入,的零,宽度,字符,fastadmin,ms,开发,记录
在tp5中过滤输入的零宽度字符【fastadmincms开发记录】
处理tag标签中的0宽空格【fastadmincms开发记录】|fastadmincms二次开发,处理,tag,标签,中的,0宽,空格,fastadmin,ms,开发,记录
处理tag标签中的0宽空格【fastadmincms开发记录】
添加专题时tags标签id出错【fastadmincms开发记录】|fastadmincms二次开发,添加,专题,时tags,标签,id,出错,fastadmin,ms,开发,记录
添加专题时tags标签id出错【fastadmincms开发记录】
20230518----模板 广告【fastadmincms开发记录】|fastadmincms二次开发,20230518,模板,广告,fastadmin,ms,开发,记录
20230518----模板 广告【fastadmincms开发记录】
cms添加视频模型【fastadmincms开发记录】|fastadmincms二次开发,ms,添加,视频,模型,fastadmin,开发,记录
cms添加视频模型【fastadmincms开发记录】
新增单篇收费复制功能【fastadmincms开发记录】|fastadmincms二次开发,新增,单篇,收费,复制,功能,fastadmin,ms,开发,记录
新增单篇收费复制功能【fastadmincms开发记录】
添加开会员折扣功能【fastadmincms开发记录】|fastadmincms二次开发,添加,开会,折扣,功能,fastadmin,ms,开发,记录
添加开会员折扣功能【fastadmincms开发记录】

历史上的今天:05月03日

热门专题

外贸网站建设|外贸网站建设,英文网站制作,英文网站设计,美国主机空间,外贸建站平台,多语言网站制作
外贸网站建设
昆明综合高中|昆明综合高中
昆明综合高中
一年制中专|中专学历,中专是什么学历,中专是什么,中专有什么专业,中专升大专,一年制中专
一年制中专
中源管业|中源管业,中源管业公司,中源管业有限公司,中源管业电话,中源管业地址,中源管业电力管,中源管业mpp电力管,中源管业cpvc电力管,中源管业pe穿线管
中源管业
自考本科|自考本科有用吗,自考文凭,自考本科文凭,自考文凭有用吗,自考本科文凭有用吗,自考文凭承认吗
自考本科
昆明网站建设|昆明网站建设,昆明网站开发,昆明网站建设公司,昆明网站建设价格,昆明网站设计,昆明网站制作,网页设计,高端网站建设,高端网站设计
昆明网站建设
大理科技管理学校|大理科技管理中等职业技术学校,大理市科技管理中等职业技术学校
大理科技管理学校
APP开发|app开发_app开发公司_app软件开发_专业app开发_云南app开发公司_app定制_原生app开发定制
APP开发

微信小程序

微信扫一扫体验

立即
投稿

微信公众账号

微信扫一扫加关注

发表
评论
返回
顶部