首页 > 网站 > WEB开发 > 正文

js闭包学习笔记

2024-04-27 14:12:50
字体:
来源:转载
供稿:网友

js闭包学习笔记

  javascript 闭包是一个很有趣的东东。看了些相关资料(http://www.cnblogs.com/TomXu/archive/2011/12/30/2288372.html 这个很给力),对其印象最深刻的是:实现了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

当在一个函数 outter 内部定义另一个函数 inner,而 inner 又引用了 outter 作用域内的变量,在 outter 之外使用 inner 函数,则形成了闭包。在闭包内部的变量将被保持,就像上面的i。

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文件。实在是太好了。


发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表