国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > JavaScript > 正文

javascript 閉包詳解

2019-11-20 13:09:13
字體:
來源:轉載
供稿:網友

javascript 閉包是一個很有趣的東東。看了些相關資料//m.survivalescaperooms.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文件。實在是太好了。

上面所述就是本文的全部內容了,希望大家能夠喜歡。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 沙坪坝区| 健康| 大方县| 新绛县| 庆云县| 呈贡县| 浦县| 花垣县| 巴林右旗| 临漳县| 汨罗市| 北辰区| 建湖县| 天全县| 延边| 海安县| 四川省| 塔城市| 涿鹿县| 辽宁省| 娄底市| 合江县| 颍上县| 富锦市| 乡宁县| 通渭县| 确山县| 扎鲁特旗| 周至县| 明溪县| 囊谦县| 益阳市| 宜宾县| 红河县| 吉水县| 沙坪坝区| 广安市| 莱州市| 明溪县| 西和县| 株洲县|