javascript - 关于匿名自执行函数的问题
高洛峰
高洛峰 2017-04-11 11:55:10
[JavaScript讨论组]

以下两种代码有什么区别?有何有缺点?谢谢

//第一种
var counter = (function(){
    var i = 0;
    return {
        get: function(){
            return i;
        },
        set: function(val){
            i = val;
        },
        increment: function(){
            return ++i;
        }
    }
}());
//第二种
var counter = {
    var i = 0;
    get: function(){
            return i;
    },
    set: function(val){
            i = val;
    },
    increment: function(){
            return ++i;
    }

}
高洛峰
高洛峰

拥有18年软件开发和IT教学经验。曾任多家上市公司技术总监、架构师、项目经理、高级软件工程师等职务。 网络人气名人讲师,...

全部回复(5)
PHPz

第二种是对象字面量的书写方式,但你的写法是错误的,正确写法应该是:

var counter = {
    i: 0,
    get: function(){
            return this.i;
    },
    set: function(val){
            this.i = val;
    },
    increment: function(){
            return ++this.i;
    }
}
 这种写法不会隔离作用域,也就是说外部可以直接访问内部的属性,并可以修改他,如:count.i。
而第一种写法实际上是一种闭包,他可以避免这个问题,即外部环境只能通过你暴露的接口访问内部属性,很好的隔离了作用域。但缺点是可能会造成内存泄漏,用大量闭包也会占用大量内存。
迷茫

首先你的第二种写法不对!

第一个匿名函数自执行的目的是通过闭包创建私有变量,即只能通过提供的特权方法才能操作变量 i ,非要说优点缺点的话,这种私有变量是普通的对象所不能拥有的,缺点就是闭包导致内存不能释放无法回收,内存泄露,但是现代浏览器对于闭包的优化已经相当的好了。

PHP中文网

第 2 种写法不是会报错吗?

PHP中文网

第一种是闭包写法 返回的对象可以访问局部变量 i
第二种 写错了 看不懂楼主要表达什么...

伊谢尔伦

闭包防止篡改&工厂模式

第一种的做法是闭包、只可以通过你的setget方法操作i变量、

第二种I不能那样写、你的counter是对象

如果写成对象属性那这个counter.i一样可以篡改、

热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号