閉包, 定時(shí)器

  • 什么是閉包? 有什么作用
    • 閉包的形成
      在高級(jí)程序設(shè)計(jì)3中對(duì)于閉包的定義是這樣的
      <blockquote>有權(quán)訪問(wèn)另一個(gè)函數(shù)作用域中的變量的函數(shù)。</blockquote>
      在Wikipedia中的定于是這樣的
      <blockquote>引用了自由變量的函數(shù)域那。</blockquote>
      一開(kāi)始渡冻,我對(duì)這樣的抽象概念很模糊霹娄,但是當(dāng)我理解了閉包之后区端,我又認(rèn)為這樣的定義是簡(jiǎn)介而有力的师脂,如果從理解閉包的定義來(lái)說(shuō)物舒,可以認(rèn)為JS中的所有函數(shù)都是閉包,因?yàn)槊總€(gè)函數(shù)都能訪問(wèn)到全局作用域的自由變量
var a = 1
function fn() {
    console.log(a)
}
fn()

在這個(gè)例子中替蛉,fn可以訪問(wèn)了全局變量a贯溅,這個(gè)函數(shù)就叫做閉包,當(dāng)然灭返,這只是從理解的角度來(lái)說(shuō)盗迟,實(shí)際上這樣的全局作用域下的閉包是沒(méi)意義的,因?yàn)槿值淖兞繉?duì)象不會(huì)被銷(xiāo)毀熙含。在函數(shù)內(nèi)部的閉包可以在chrome的開(kāi)發(fā)者工具看到


2016-08-19_154334.png

要理解閉包的和閉包的作用罚缕,就要從作用域鏈的形成開(kāi)始,通過(guò)下面的例子來(lái)說(shuō)明

var a =2
function fn() {
    var a = 1
    function fn2() {
        console.log(a)
    }
    fn2()
}
fn()

因?yàn)閖s是詞法作用域怎静,當(dāng)函數(shù)fn聲明的時(shí)候邮弹,就會(huì)預(yù)先包含全局作用域鏈,然后放在fn.Scope中蚓聘,[[Scope]]是一個(gè)只有語(yǔ)言內(nèi)部才能訪問(wèn)的屬性腌乡,當(dāng)函數(shù)fn被調(diào)用的調(diào)用的時(shí)候,會(huì)創(chuàng)建一個(gè)執(zhí)行環(huán)境夜牡,執(zhí)行環(huán)境里面有兩個(gè)東西与纽,一個(gè)是變量對(duì)象在函數(shù)內(nèi)部又叫活動(dòng)對(duì)象,一個(gè)是作用域鏈塘装,作用域鏈的形成就是復(fù)制fn.Scope里面的變量對(duì)象急迂,然后推入當(dāng)前的活動(dòng)對(duì)象。當(dāng)fn執(zhí)行完的時(shí)候蹦肴,本來(lái)fn執(zhí)行環(huán)境的變量對(duì)象和作用域鏈都會(huì)銷(xiāo)毀僚碎,但是現(xiàn)在只有作用域鏈銷(xiāo)毀了,變量對(duì)象卻沒(méi)有銷(xiāo)毀阴幌,因?yàn)閮?nèi)部的函數(shù)fn2的作用域鏈在引用這fn的變量對(duì)象勺阐。因?yàn)閒n2的作用域鏈里面包含fn的變量對(duì)象,所以可以訪問(wèn)到fn的變量矛双,所以也就形成了閉包渊抽。
- 閉包的缺點(diǎn)
1. 在IE9之前因?yàn)槭褂貌煌睦占瘷C(jī)制會(huì)導(dǎo)致循環(huán)引用會(huì)造成內(nèi)存泄漏
2. 閉包會(huì)攜帶包含函數(shù)的作用域,所以會(huì)比其他函數(shù)占用更多內(nèi)存议忽,過(guò)度使用閉包會(huì)造成內(nèi)存占用過(guò)多
- 閉包的用法
其實(shí)保存變量現(xiàn)場(chǎng)腰吟,封裝私有變量都是對(duì)閉包特性的利用,并不是閉包的定義,不要混淆
1. 保存變量現(xiàn)場(chǎng)毛雇,主要利用了js函數(shù)傳遞參數(shù)的方式是按值傳遞

!function() {
    var arr = []
    for (var i = 0; i < 5; i++) {
        arr[i] = function () {
            alert(i)
        }
    }
    arr[1]()//5
}()

本來(lái)的打算應(yīng)該數(shù)字的每一項(xiàng)都是一個(gè)函數(shù),可以打印出每一項(xiàng)的索引侦镇,但是因?yàn)樗L問(wèn)的i是外部函數(shù)的灵疮,當(dāng)循環(huán)完以后,i已經(jīng)累加到5了壳繁,所以無(wú)論多少輸出當(dāng)然是5震捣,我們可以利用js函數(shù)傳遞是按值傳遞的方式來(lái)改造這個(gè)數(shù)組

!function() {
    var arr = []
    for (var i = 0; i < 5; i++) {
        arr[i] = function (n) {
            return function () {
                alert(n)
            }
        }(i)
    }
    arr[1]()//5
}()

改造后的函數(shù)輸出就是1,主要利用按值傳遞參數(shù)和閉包
2. 封裝私有變量
有時(shí)候我們常常需要隱藏一些數(shù)據(jù)闹炉,而僅僅暴露一些接口供外部使用蒿赢,起到封裝的效果,這時(shí)候就可以利用閉包

var Car = (function () {
    var speed = 0
    return {
        setSpeed: function (s) {
            speed = s
        },
        getSpeed: function () {
            return speed
        }
    }
})()
Car.setSpeed(30)
Car.getSpeed()

這就封裝了一個(gè)汽車(chē)對(duì)象渣触,其中是speed私有的變量羡棵,只能通過(guò)我們提供的接口setSpeed和getSpeed來(lái)訪問(wèn)到

  • setTimeout 0 有什么作用
    setTimeout表示的是超時(shí)調(diào)用,setTimeout可以接受多個(gè)參數(shù)嗅钻,表示過(guò)延遲多長(zhǎng)時(shí)間再執(zhí)行回調(diào)函數(shù)
    • 第一個(gè)參數(shù)表示回調(diào)函數(shù)皂冰,可以是一個(gè)字符串或者是一個(gè)函數(shù)名,推薦使用函數(shù)名养篓,因?yàn)樽址畷?huì)導(dǎo)致一定的損耗和安全問(wèn)題
    • 第二個(gè)參數(shù)表示延遲的時(shí)間秃流,單位是ms毫秒,因?yàn)閖s是單線程的解釋器柳弄,所以一次只能執(zhí)行一段代碼舶胀,為了控制要執(zhí)行的代碼,就有一個(gè)任務(wù)隊(duì)列碧注,這些任務(wù)就會(huì)按照他們添加到任務(wù)隊(duì)列的順序執(zhí)行嚣伐,延遲的時(shí)間表示再過(guò)多少ms才把當(dāng)前任務(wù)添加到任務(wù)隊(duì)列,如果隊(duì)列前面沒(méi)有任務(wù)应闯,當(dāng)前任務(wù)就會(huì)立即執(zhí)行纤控,如果隊(duì)列前面有任務(wù),就要等到前面的任務(wù)執(zhí)行完之后再執(zhí)行
    • 第三個(gè)和后面的參數(shù)表示參數(shù)回調(diào)函數(shù)的參數(shù)
      setTimeout(f,0)表示的就是盡快的執(zhí)行函數(shù)f碉纺,他的作用可以調(diào)整時(shí)間的發(fā)生順序船万,例如在開(kāi)發(fā)中,某個(gè)事件發(fā)生在子元素骨田,然后冒泡到父元素耿导,即子元素的回調(diào)函數(shù)會(huì)比父元素的回調(diào)函數(shù)先執(zhí)行,通過(guò)setTimeout(f,0)我們就可以讓子元素的回調(diào)函數(shù)排在隊(duì)列后面态贤,從而讓父元素的回調(diào)函數(shù)先執(zhí)行
      參考:
      定時(shí)器-阮一峰
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末舱呻,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌箱吕,老刑警劉巖芥驳,帶你破解...
    沈念sama閱讀 211,042評(píng)論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異茬高,居然都是意外死亡兆旬,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 89,996評(píng)論 2 384
  • 文/潘曉璐 我一進(jìn)店門(mén)怎栽,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)丽猬,“玉大人,你說(shuō)我怎么就攤上這事熏瞄〗潘睿” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 156,674評(píng)論 0 345
  • 文/不壞的土叔 我叫張陵强饮,是天一觀的道長(zhǎng)由桌。 經(jīng)常有香客問(wèn)我,道長(zhǎng)胡陪,這世上最難降的妖魔是什么沥寥? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 56,340評(píng)論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮柠座,結(jié)果婚禮上邑雅,老公的妹妹穿的比我還像新娘。我一直安慰自己妈经,他們只是感情好淮野,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,404評(píng)論 5 384
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著吹泡,像睡著了一般骤星。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上爆哑,一...
    開(kāi)封第一講書(shū)人閱讀 49,749評(píng)論 1 289
  • 那天洞难,我揣著相機(jī)與錄音,去河邊找鬼揭朝。 笑死队贱,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的潭袱。 我是一名探鬼主播柱嫌,決...
    沈念sama閱讀 38,902評(píng)論 3 405
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼屯换!你這毒婦竟也來(lái)了编丘?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 37,662評(píng)論 0 266
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎嘉抓,沒(méi)想到半個(gè)月后索守,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,110評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡掌眠,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,451評(píng)論 2 325
  • 正文 我和宋清朗相戀三年蕾盯,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片蓝丙。...
    茶點(diǎn)故事閱讀 38,577評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖望拖,靈堂內(nèi)的尸體忽然破棺而出渺尘,到底是詐尸還是另有隱情,我是刑警寧澤说敏,帶...
    沈念sama閱讀 34,258評(píng)論 4 328
  • 正文 年R本政府宣布鸥跟,位于F島的核電站,受9級(jí)特大地震影響盔沫,放射性物質(zhì)發(fā)生泄漏医咨。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,848評(píng)論 3 312
  • 文/蒙蒙 一架诞、第九天 我趴在偏房一處隱蔽的房頂上張望拟淮。 院中可真熱鬧,春花似錦谴忧、人聲如沸很泊。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,726評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)委造。三九已至,卻和暖如春均驶,著一層夾襖步出監(jiān)牢的瞬間昏兆,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,952評(píng)論 1 264
  • 我被黑心中介騙來(lái)泰國(guó)打工妇穴, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留爬虱,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 46,271評(píng)論 2 360
  • 正文 我出身青樓伟骨,卻偏偏與公主長(zhǎng)得像饮潦,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子携狭,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,452評(píng)論 2 348

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

  • 什么是閉包? 有什么作用閉包:函數(shù)對(duì)象可以通過(guò)作用域鏈相互關(guān)聯(lián),函數(shù)體內(nèi)部的變量可以保存在函數(shù)的作用域內(nèi)稀并。 上述代...
    coolheadedY閱讀 725評(píng)論 0 0
  • 問(wèn)題 一碘举、什么是閉包? 有什么作用忘瓦? 閉包閉包就是能夠讀取其他函數(shù)內(nèi)部變量的函數(shù)。在javascript中引颈,只有函...
    婷樓沐熙閱讀 576評(píng)論 0 0
  • 問(wèn)答 1.什么是閉包? 有什么作用蝙场? 閉包 簡(jiǎn)而言之 就是讓函數(shù)外部可以訪問(wèn)函數(shù)內(nèi)的局部變量,就是將函數(shù)內(nèi)部和函數(shù)...
    我是小韓閱讀 304評(píng)論 1 0
  • 1.什么是閉包? 有什么作用 定義:閉包就是嵌套在函數(shù)里面的內(nèi)部函數(shù)售滤,并且該內(nèi)部函數(shù)可以訪問(wèn)外部函數(shù)中聲明的所有局...
    饑人谷區(qū)子銘閱讀 918評(píng)論 0 2
  • “那時(shí)我們有夢(mèng)罚拟,關(guān)于文學(xué),關(guān)于愛(ài)情完箩,關(guān)于穿越世界的旅行赐俗。”北島所說(shuō)的“那時(shí)”大概就是我們這樣一個(gè)年紀(jì)吧弊知,對(duì)于自...
    惜愛(ài)汐閱讀 375評(píng)論 0 4