javascript 闭包详解


Posted in Javascript onFebruary 15, 2015

javascript 闭包是一个很有趣的东东。看了些相关资料https://3water.com/article/29472.htm,对其印象最深刻的是:实现了public 和private。

创建一个非匿名闭包最简单的语法是:

var obj = (function(){//各种代码  });

闭包最经典的例子:

var makeCounter = (function () {

        var i = 1; 

        this.test=function(){ 

            console.log(i);

            i++; 

        }

        return this;

    });

    var obj = makeCounter();

    obj.test(); // 1

    obj.test(); // 2

    var obj1 = makeCounter();

    obj1.test(); // 1

    obj1.test(); // 2

private 与 public :

var makeCounter= (function () {

        var i = 1;

        //这货是private的

        function log(){

            console.log(i);

            i++;

        }

        //这货是public的

        this.test(){

            log();

        }

        return this;

    });

    var obj = makeCounter();

    obj.test(); // 1

    obj.test(); // 2 

    obj.log(); //undefined   

自执行函数:

第一次看到这样的代码时的感觉是:好高级;

var obj = (function(window){

      //各种代码

}(window));

然后google了下,发现他们经常都会这样写:

var obj= (function () {

        var i = 1; 

        this.test=function(){ 

            console.log(i);

            i++; 

        }

        return this;

    }());

    obj.test(); // 1

    obj.test(); // 2

     最简单的理解,程序员偷懒把两步写成了一步。

    //这是一个函数。它应该这样用obj()

    var makeCounter = function () {

        //各种代码 

    }

    //这是一个对象。它类似于 var obj = makeCounter();

    var obj = (function () {

        //各种代码

    }());

它也可以有参数:

    var output = "new test";

    var obj = (function (msg) {

        this.test = function(){

            console.log(msg);

        }

        return this;

    }(output));

    obj.test();

它还可以更复杂更高级点:

var output = "new test";

    var obj = (function (obj, msg) {

        //这货也是私有的。类似obj.i(!=obj.i),却又不是obj.i(因为外部不可访问)。

        var i = 1;

        //private

        function log() {

            console.log(i + " : " + msg);

            i++;

        }

        //public

        obj.test = function () {

            log();

        }

        return obj;

    }(obj, output));

    obj.test(); // 1 : new test

    obj.i = 100;

    //i没被改变

    obj.test(); // 2 : new test

初次见面,留下了很深刻的印象。闭包的使用,实现了状态,属性的保持;避免了全局变量满屏飞舞;结束了变量老是被重定义,重赋值的尴尬局面。它还可以将一个对象分部到多个js文件。实在是太好了。

上面所述就是本文的全部内容了,希望大家能够喜欢。

Javascript 相关文章推荐
打印json对象的内容及JSON.stringify函数应用
Mar 29 Javascript
Javascript学习笔记之 对象篇(四) : for in 循环
Jun 24 Javascript
Node.js实现批量去除BOM文件头
Dec 20 Javascript
jQuery插件简单实现方法
Jul 18 Javascript
jquery+CSS实现的多级竖向展开树形TRee菜单效果
Aug 24 Javascript
js实现的简洁网页滑动tab菜单效果代码
Aug 24 Javascript
leaflet的开发入门教程
Nov 17 Javascript
vue页面使用阿里oss上传功能的实例(二)
Aug 09 Javascript
vue2.0 兄弟组件(平级)通讯的实现代码
Jan 15 Javascript
Vue源码中要const _toStr = Object.prototype.toString的原因分析
Dec 09 Javascript
webpack HappyPack实战详解
Oct 08 Javascript
vue中的可拖拽宽度div的实现示例
Apr 08 Vue.js
PhotoShop给图片自动添加边框及EXIF信息的JS脚本
Feb 15 #Javascript
浅析javascript中函数声明和函数表达式的区别
Feb 15 #Javascript
不同编码的页面表单数据乱码问题解决方法
Feb 15 #Javascript
浅谈javascript中this在事件中的应用
Feb 15 #Javascript
javascript使用正则表达式实现去掉空格之后的字符
Feb 15 #Javascript
分享一个自己写的简单的javascript分页组件
Feb 15 #Javascript
Linux下编译安装php libevent扩展实例
Feb 14 #Javascript
You might like
整理的一些实用WordPress后台MySQL操作命令
2013/01/07 PHP
ThinkPHP查询中的魔术方法简述
2014/06/25 PHP
php限制上传文件类型并保存上传文件的方法
2015/03/13 PHP
简单谈谈PHP中strlen 函数
2016/02/27 PHP
PHP使用SOAP调用API操作示例
2018/12/25 PHP
JavaScript作用域链使用介绍
2013/08/29 Javascript
购物车选中得到价格实现示例
2014/01/26 Javascript
JavaScript获取网页中第一个图片id的方法
2015/04/03 Javascript
JS实现设置ff与ie元素绝对位置的方法
2016/03/08 Javascript
学做Bootstrap的第一个页面
2016/05/15 HTML / CSS
JavaScript中误用/g导致的正则test()无法正确重复执行的解决方案
2016/07/27 Javascript
AngularJS基础 ng-init 指令简单示例
2016/08/02 Javascript
js时间比较 js计算时间差的简单实现方法
2016/08/26 Javascript
Angular.JS内置服务$http对数据库的增删改使用教程
2017/05/07 Javascript
JavaScript作用域、闭包、对象与原型链概念及用法实例总结
2018/08/20 Javascript
对layui初始化列表的CheckBox属性详解
2019/09/13 Javascript
[36:33]Ti4 循环赛第四日 附加赛NEWBEE vs Mouz
2014/07/13 DOTA
[04:48]DOTA2上海特锦赛小组赛第三日 TOP10精彩集锦
2016/02/28 DOTA
[42:25]EG vs Spirit Supermajor 败者组 BO3 第二场 6.4
2018/06/05 DOTA
python搭建简易服务器分析与实现
2012/12/15 Python
Python实现新浪博客备份的方法
2016/04/27 Python
python3利用tcp实现文件夹远程传输
2018/07/28 Python
python如何实现数据的线性拟合
2019/07/19 Python
Python连接HDFS实现文件上传下载及Pandas转换文本文件到CSV操作
2020/06/06 Python
python3从网络摄像机解析mjpeg http流的示例
2020/11/13 Python
如何利用Python matplotlib绘制雷达图
2020/12/21 Python
中国跨境海淘网站:考拉海购
2016/08/01 全球购物
英国香水店:The Perfume Shop
2017/03/27 全球购物
英语专业毕业个人求职自荐信
2013/09/21 职场文书
社会实践心得体会
2014/01/03 职场文书
体育教师自我鉴定
2014/02/12 职场文书
点菜员岗位职责范本
2014/02/14 职场文书
人力资源管理专业毕业生自荐书
2014/05/25 职场文书
会议通知格式范文
2015/04/15 职场文书
2015年机械设备管理工作总结
2015/05/04 职场文书
详解MySQL的半同步
2021/04/22 MySQL