閉包

作用域鏈

  • 函數(shù)在執(zhí)行的過程中补胚,先從自己內(nèi)部找變量
  • 如果找不到,再?gòu)膭?chuàng)建當(dāng)前函數(shù)所在的作用域(詞法作用域)去找罩润,以此往上
  • 注意找的是變量的當(dāng)前的狀態(tài)
    函數(shù)聯(lián)通它的作用域鏈上的找的這個(gè)變量荠察,共同構(gòu)成閉包
    一般情況下使用閉包主要是為了
  1. 封裝數(shù)據(jù)
  2. 暫存數(shù)據(jù)

典型閉包

function car(){
  var speed = 0
  function fn(){
    speed++
    console.log(speed)
  }
  return fn
}

var speedUp = car()
speedUp()   //1
speedUp()   //2

如下代碼輸入出多少蚤霞?如果輸出3挑豌,那如何改造代碼安券?

var fnArr = [];
for (var i = 0; i < 10; i ++) {
  fnArr[i] =  function(){
    return i
  };
}
console.log( fnArr[3]() )
var fnArr = [];
for (var i = 0; i < 10; i++) {
    (function (i) {
        fnArr[i]= function () {
            return i
        }
    })(i);
}
console.log( fnArr[3]() )//3

封裝一個(gè)car對(duì)象

var Car = (function(){
   var speed = 0;
   //補(bǔ)充
   return {
      setSpeed: setSpeed,
      get: get,
      speedUp: speedUp,
      speedDown: speedDown
   }
})()
Car.set(30)
Car.get() //30
Car.speedUp()
Car.get() //31
Car.speedDown()
Car.get()  //30
var Car = (function(){
    var speed = 0;
    function set(speed1){
        speed = speed1
        console.log(speed)
    }
    function get(){
        console.log(speed)
        return speed;
    }
    function speedUp(){
        speed++;
        console.log(speed)
    }
    function speedDown(){
        speed--;
        console.log(speed)
    }
    return {
        set: set,
        get: get,
        speedUp: speedUp,
        speedDown: speedDown
    }
})()
Car.set(30)
Car.get() //30
Car.speedUp()
Car.get() //31
Car.speedDown()
Car.get()  //30

如下代碼輸出多少?如何連續(xù)輸出 0,1,2,3,4氓英?

for(var i=0; i<5; i++){
  setTimeout(function(){
    console.log('delayer:' + i )
  }, 0)
}
    (function (j) {
        setTimeout(() => {
            console.log( + j ) 
        }, 0);
    })(i)  
}
//0,1,2,3,4

如下代碼輸出多少完疫?

function makeCounter() {
  var count = 0

  return function() {
    return count++
  };
}

var counter = makeCounter()
var counter2 = makeCounter();

console.log( counter() ) // 0
console.log( counter() ) // 1

console.log( counter2() ) // ?
console.log( counter2() ) // ?

function makeCounter() {
    var count = 0
  
    return function() {
      return count++
    };
  }
  
  var counter = makeCounter()
  var counter2 = makeCounter();
  
  console.log( counter() ) // 0
  console.log( counter() ) // 1
  
  console.log( counter2() ) // 0
  console.log( counter2() ) // 1

補(bǔ)全代碼,實(shí)現(xiàn)數(shù)組按姓名债蓝、年紀(jì)、任意字段排序盛龄。

var users = [
  { name: "John", age: 20, company: "Baidu" },
  { name: "Pete", age: 18, company: "Alibaba" },
  { name: "Ann", age: 19, company: "Tecent" }
]

users.sort(byField('age'))
users.sort(byField('company'))
var users = [
    { name: "John", age: 20, company: "Baidu" },
    { name: "Pete", age: 18, company: "Alibaba" },
    { name: "Ann", age: 19, company: "Tecent" }
]
function byField(string){
    return function(user1,user2){
        return user1[string] >user2[string]
    }
}
users.sort(byField('age'));
users.sort(byField('name'))
users.sort(byField('company'))

寫一個(gè) sum 函數(shù)饰迹,實(shí)現(xiàn)如下調(diào)用方式。

console.log( sum(1)(2) ) // 3
console.log( sum(5)(-1) ) // 4
function sum(a) {
    return function (b) {
        return a + b;
    }
}
console.log( sum(1)(2) ) // 3
console.log( sum(5)(-1) ) // 4

待補(bǔ)充

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末余舶,一起剝皮案震驚了整個(gè)濱河市啊鸭,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌匿值,老刑警劉巖赠制,帶你破解...
    沈念sama閱讀 211,743評(píng)論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異挟憔,居然都是意外死亡钟些,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,296評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門绊谭,熙熙樓的掌柜王于貴愁眉苦臉地迎上來政恍,“玉大人,你說我怎么就攤上這事达传「莺模” “怎么了迫筑?”我有些...
    開封第一講書人閱讀 157,285評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)宗弯。 經(jīng)常有香客問我脯燃,道長(zhǎng),這世上最難降的妖魔是什么蒙保? 我笑而不...
    開封第一講書人閱讀 56,485評(píng)論 1 283
  • 正文 為了忘掉前任辕棚,我火速辦了婚禮,結(jié)果婚禮上追他,老公的妹妹穿的比我還像新娘坟募。我一直安慰自己,他們只是感情好邑狸,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,581評(píng)論 6 386
  • 文/花漫 我一把揭開白布懈糯。 她就那樣靜靜地躺著,像睡著了一般单雾。 火紅的嫁衣襯著肌膚如雪赚哗。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,821評(píng)論 1 290
  • 那天硅堆,我揣著相機(jī)與錄音屿储,去河邊找鬼。 笑死渐逃,一個(gè)胖子當(dāng)著我的面吹牛够掠,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播茄菊,決...
    沈念sama閱讀 38,960評(píng)論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼疯潭,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了面殖?” 一聲冷哼從身側(cè)響起竖哩,我...
    開封第一講書人閱讀 37,719評(píng)論 0 266
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎脊僚,沒想到半個(gè)月后相叁,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,186評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡辽幌,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,516評(píng)論 2 327
  • 正文 我和宋清朗相戀三年增淹,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片舶衬。...
    茶點(diǎn)故事閱讀 38,650評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡埠通,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出逛犹,到底是詐尸還是另有隱情端辱,我是刑警寧澤梁剔,帶...
    沈念sama閱讀 34,329評(píng)論 4 330
  • 正文 年R本政府宣布,位于F島的核電站舞蔽,受9級(jí)特大地震影響荣病,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜渗柿,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,936評(píng)論 3 313
  • 文/蒙蒙 一个盆、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧朵栖,春花似錦颊亮、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,757評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至门扇,卻和暖如春雹有,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背臼寄。 一陣腳步聲響...
    開封第一講書人閱讀 31,991評(píng)論 1 266
  • 我被黑心中介騙來泰國(guó)打工霸奕, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人吉拳。 一個(gè)月前我還...
    沈念sama閱讀 46,370評(píng)論 2 360
  • 正文 我出身青樓质帅,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親留攒。 傳聞我的和親對(duì)象是個(gè)殘疾皇子临梗,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,527評(píng)論 2 349

推薦閱讀更多精彩內(nèi)容

  • 一汤善、作用域 A、定義 代碼在運(yùn)行時(shí)票彪,各個(gè)變量红淡、函數(shù)和對(duì)象的可訪問性。換句話說降铸,作用域決定了你的代碼里的變量和其他資...
    5吖閱讀 599評(píng)論 0 1
  • 變量 變量分為全局變量和局部變量在旱,全局變量就是指該變量的作用域?yàn)楫?dāng)前文檔,也就是說全局變量在當(dāng)前文檔的所有Java...
    jrg陳咪咪sunny閱讀 348評(píng)論 0 1
  • 閉包是自包含的功能塊推掸,可以在代碼中傳遞和使用桶蝎。Swift中的閉包類似于C和Objective-C中的block驻仅,也...
    微笑中的你閱讀 378評(píng)論 0 0
  • 需求是使用3個(gè)check選中日 顯示當(dāng)日貢獻(xiàn)選中周 顯示本周累計(jì)貢獻(xiàn)選中總 顯示歷史總數(shù)累計(jì)貢獻(xiàn)3個(gè)都不選中 則顯...
    人氣小哥閱讀 611評(píng)論 0 0
  • 6公司今年不放假,今年春節(jié)又要在勞動(dòng)中度過了登渣。臘月二十五昌樂大集噪服,與阿華去農(nóng)貿(mào)城采購(gòu)年貨。買了一只公雞胜茧,一只母雞(...
    南良大維閱讀 235評(píng)論 0 3