亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > 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久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
狠狠色狠狠色综合日日小说| 国产精品视频免费在线观看| 国产suv精品一区二区三区88区| 韩国视频理论视频久久| 亚洲成人av片| 欧美视频中文字幕在线| 国产精品成久久久久三级| 欧美日韩激情美女| 国产在线日韩在线| 亚洲激情在线观看视频免费| 欧美国产日韩视频| 亚洲丁香久久久| 最近日韩中文字幕中文| 国产专区精品视频| 精品av在线播放| 国产精品久久久久久av福利| 日韩精品久久久久久久玫瑰园| 国产一区在线播放| 精品久久久久久久中文字幕| 亚洲一区二区三区在线免费观看| 国产精品自产拍在线观看中文| 欧美资源在线观看| 国产一区二区免费| 国产偷国产偷亚洲清高网站| 国产精品扒开腿爽爽爽视频| 久久久久久久久国产| 色噜噜国产精品视频一区二区| 国产激情999| 久久99久久99精品中文字幕| 少妇av一区二区三区| 91精品国产91久久久久| 亚洲一区中文字幕| 日日狠狠久久偷偷四色综合免费| 亚洲加勒比久久88色综合| 国产精品久久久久久中文字| 久久精品精品电影网| 色在人av网站天堂精品| 亚洲伊人一本大道中文字幕| 亚洲xxx大片| 欧美中文在线观看国产| 国产在线视频91| 欧美一区二区三区图| 久久综合久久八八| 国产精品爱啪在线线免费观看| 日韩视频免费中文字幕| 亚洲影视九九影院在线观看| 91wwwcom在线观看| 国产91av在线| 欧美激情乱人伦一区| 国产视频精品xxxx| 久久亚洲精品成人| 亚洲精品色婷婷福利天堂| 色香阁99久久精品久久久| 怡红院精品视频| 欧美大片第1页| 粗暴蹂躏中文一区二区三区| 午夜精品蜜臀一区二区三区免费| 浅井舞香一区二区| 亚洲免费影视第一页| 在线观看亚洲区| 伊人成人开心激情综合网| 97在线视频精品| 一区二区中文字幕| 久久伊人精品视频| 色综合五月天导航| 欧美美女操人视频| 精品国产区一区二区三区在线观看| 97香蕉超级碰碰久久免费的优势| 成人午夜在线视频一区| 国产精品免费网站| 亚洲精品国产品国语在线| 成人激情黄色网| 欧美日韩国产丝袜另类| 久久精品99久久久香蕉| 欧美午夜激情小视频| 亚洲男人的天堂网站| 国产精品久久久91| 欧美精品激情视频| 亚洲九九九在线观看| 中文字幕亚洲国产| 色综合91久久精品中文字幕| 精品久久久久久久久久| 热草久综合在线| 亚洲男女自偷自拍图片另类| 久久精品视频播放| 国产精品久久久久久久久久久久久| 亚洲理论片在线观看| 亚洲一区国产精品| 日韩的一区二区| 亚洲综合日韩中文字幕v在线| 色综合久综合久久综合久鬼88| 国产精品视频网站| 久久人人97超碰精品888| 久久久久久美女| 亚洲xxxxx| 国产国语刺激对白av不卡| 久久视频在线视频| 美女av一区二区| 91精品久久久久久久久久久| 亚洲的天堂在线中文字幕| 欧美高清视频在线播放| 色视频www在线播放国产成人| 一本久久综合亚洲鲁鲁| 久久久久亚洲精品成人网小说| 亚洲色图25p| 91久久久久久| 日韩黄色av网站| 国产视频精品一区二区三区| 亚洲精品v欧美精品v日韩精品| 国产精品91免费在线| 亚洲女人天堂网| 国产一区二区丝袜高跟鞋图片| 国产精品99久久久久久久久久久久| 欧美最猛性xxxxx亚洲精品| 国产精品最新在线观看| 日韩av在线不卡| 中文一区二区视频| 亚洲天堂av在线播放| 国产欧美日韩高清| 国产91在线视频| 日韩黄色在线免费观看| 97视频免费观看| 精品国产欧美一区二区五十路| 久久在线精品视频| 色偷偷亚洲男人天堂| 美日韩精品免费视频| 日韩av中文字幕在线播放| 亚洲最新在线视频| 欧美精品在线免费播放| 亚洲精品免费一区二区三区| 97色在线观看免费视频| 97色在线观看| 91精品久久久久久久久久| 国产精品igao视频| 日韩国产精品亚洲а∨天堂免| 色偷偷亚洲男人天堂| 国产精品嫩草影院一区二区| 国产成人在线一区| 国产欧美精品一区二区三区介绍| 亚洲天堂开心观看| 国产91精品最新在线播放| 欧美激情性做爰免费视频| 亚洲电影免费观看高清| 成人久久久久久| 中文字幕综合一区| 亚洲精品一二区| 日韩av观看网址| 欧洲日本亚洲国产区| 日韩在线视频免费观看| 国产精品99久久久久久人| 亚洲视频第一页| 亚洲成人激情在线观看| 欧美成aaa人片免费看| 91亚洲永久免费精品| 国产精品黄色影片导航在线观看| 日韩精品电影网| 在线国产精品播放| 亚洲图片欧洲图片av| 国产午夜精品理论片a级探花| 亚洲mm色国产网站| 欧美日韩在线看| 欧美大片欧美激情性色a∨久久| 懂色av一区二区三区| 久久久久久久久久国产|