麻豆小视频在线观看_中文黄色一级片_久久久成人精品_成片免费观看视频大全_午夜精品久久久久久久99热浪潮_成人一区二区三区四区

首頁 > 編程 > JavaScript > 正文

Javascript學習筆記之 函數篇(三) : 閉包和引用

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

Javascript 中一個最重要的特性就是閉包的使用。因為閉包的使用,當前作用域總可以訪問外部的作用域。因為 Javascript 沒有塊級作用域,只有函數作用域,所以閉包的使用與函數是緊密相關的。

模擬私有變量

復制代碼 代碼如下:

function Counter(start) {
    var count = start;
    return {
        increment: function() {
            count++;
        },
        get: function() {
            return count;
        }
    }
}
var foo = Counter(4);
foo.increment();
foo.get(); // 5

這里 Counter 返回兩個閉包:函數 increment 和 get。這兩個函數一直保持著對 Counter 作用域的訪問,因此它們能一直訪問到定義在 Counter 作用域的變量 count。

私有變量的工作機制

由于 Javascript 不可以對作用域賦值和引用,所以在上例中,是沒有辦法在外部直接訪問內部私有變量 count。唯一的方法就是通過定義閉包來訪問。

復制代碼 代碼如下:

var foo = new Counter(4);
foo.hack = function() {
    count = 1337;
};

上面的代碼不會改變 Counter 作用域內的 count 變量值,因為 hack 沒有在 Counter 內定義。上面這段代碼只會創建或者覆蓋全局變量 count。

循環內的閉包

一個最容易犯的錯誤就是在循環內使用閉包。

復制代碼 代碼如下:

for(var i = 0; i < 10; i++) {
    setTimeout(function() {
        console.log(i); 
    }, 1000);
}

上面這段代碼不會輸出0到9,而是連續輸出10次10。
上面的匿名會一直保持一個對變量 i 的引用。當調用 console.log 函數開始輸出時,這是循環已經結束,而變量 i 已經為10了。
為了避免上面的錯誤發生,我們需要在每次循環時為變量 i 值創建一個拷貝。

避免引用錯誤

為了復制循環中變量的值,最好的方式是在外層加一個匿名的立刻執行函數。

復制代碼 代碼如下:

for(var i = 0; i < 10; i++) {
    (function(e) {
        setTimeout(function() {
            console.log(e); 
        }, 1000);
    })(i);
}

這個外部的匿名函數接收循環變量 i 作為第一個參數,并將其值拷貝至它自身的參數 e。
外部的匿名函數將參數 e 再傳遞給 setTimeout,因此 setTimeout 有了指向參數 e 的引用。而且這個參數 e 的值不會因為外部的循環改變而改變。

還有另外一個方法可以實現同樣的效果,就是在 setTimeout 內的匿名函數中再返回一個匿名函數:

復制代碼 代碼如下:

for(var i = 0; i < 10; i++) {
    setTimeout((function(e) {
        return function() {
            console.log(e);
        }
    })(i), 1000)
}

此外,通過 bind 方法也可以實現。

復制代碼 代碼如下:

for(var i = 0; i < 10; i++) {
    setTimeout(console.log.bind(console, i), 1000);
}

文章最后我們來總結下:

(1)閉包是一種設計原則,它通過分析上下文,來簡化用戶的調用,讓用戶在不知曉的情況下,達到他的目的;
(2)網上主流的對閉包剖析的文章實際上是和閉包原則反向而馳的,如果需要知道閉包細節才能用好的話,這個閉包是設計失敗的;
(3)盡量少學習。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 日韩av在线播放一区 | 中文字幕欧美在线 | 久久久久亚洲视频 | 美女久久久久 | 男女污视频在线观看 | 91一区二区三区久久久久国产乱 | 蜜桃精品视频 | 午夜视频福利 | 91成人久久 | 欧美特黄一级高清免费的香蕉 | 最新亚洲视频 | 成年人激情在线 | 最新在线中文字幕 | 欧美精品一区二区久久久 | 欧美 亚洲 视频 | 亚洲一区在线免费视频 | 久久99综合久久爱伊人 | 欧美城网站地址 | 精品国产一区二区三区久久久 | 国产成人在线网站 | 成人毛片在线免费看 | 九一成人 | 久久精品视频一区二区三区 | 欧美精品18| 黄色片在线免费播放 | 二区三区在线观看 | 成人午夜视频在线观看 | 亚洲午夜电影 | 久久国产精品一区 | 毛片免费视频观看 | 中文字幕在线资源 | 成人午夜免费av | 色播久久| 性 毛片 | 午夜视频国产 | 国产午夜精品一区二区三区免费 | 日本68xxxx| 日本一区二区免费在线观看 | 精品国产一区二区三区久久久 | 色播久久| 久久爽精品区穿丝袜 |