JavaScript 筆記三:作用域裂垦、閉包顺囊、內(nèi)存的管理與泄漏

都是本人理解肌索,筆記大致概念蕉拢,不詳細(xì)也并非完全正確,所以僅供參考诚亚。


作用域

ES5 中晕换,除全局作用域外,每一個(gè)函數(shù)塊存在屬于自己的作用域站宗,稱之為函數(shù)作用域闸准,在其內(nèi)部聲明的變量無法被外部使用到。

但可以使用上級(jí)作用域的變量梢灭,其概念類似原型鏈夷家,一層一層尋找,找到了就使用敏释。

原型鏈參考筆記二:JavaScript 原型鏈的深度剖析

而全局下的變量就屬于全局作用域库快。

var a = 123;
window.a === a // true

ES6 中新增了一個(gè)塊級(jí)作用域,主要是給 let 和 const 使用钥顽,簡單來說就是义屏,任何被函數(shù) {} 包裹的區(qū)域,如:

if(1){
  let a = 1;
  const b = 2;
}
console.log(a); // a is not defined
console.log(b); // b is not defined

閉包

簡單來說,就是一個(gè)作用域里可以調(diào)用外部作用域的變量和函數(shù)闽铐,則稱之為閉包蝶怔。

PS:如果一個(gè)函數(shù)訪問了它的外部變量,那么它就是一個(gè)閉包兄墅。

function a(x) {
var age = x;
return function (name) {
    console.log(name, age);
    age++;
  }
}
var age = 10;
var b = a(age);
b('jack'); // jack 10
b('jack'); // jack 11
b('jack'); // jack 12

所以可以說踢星,a 實(shí)現(xiàn)了閉包。


內(nèi)存管理(垃圾收集機(jī)制)

內(nèi)存管理的機(jī)制就是周期性執(zhí)行這一操作:找出不再使用的變量察迟,釋放其空間斩狱。

主要有以下兩種方式。

  • 標(biāo)記清除
  • 引用計(jì)數(shù)

標(biāo)記清除

標(biāo)記清除是JavaScript最常用的內(nèi)存管理機(jī)制扎瓶,即當(dāng)變量進(jìn)入環(huán)境時(shí)所踊,則標(biāo)記這個(gè)變量為進(jìn)入,而當(dāng)變量離開環(huán)境時(shí)概荷,則將其標(biāo)記為離開秕岛。

function add(n){
  var sum += n;    // 進(jìn)入
  return sum;      // 離開
}
add(1); // 1

變量的定義和賦空值,也會(huì)出發(fā)標(biāo)記清除:

var user = {
  name: 'jack',
  age: 20
};  // 在作用域定義變量误证,標(biāo)記變量為進(jìn)入

// some code ...

user = null;    //最后定義為null继薛,標(biāo)記變量為離開,釋放內(nèi)存

引用計(jì)數(shù)

引用計(jì)數(shù)是不太常見的內(nèi)存管理機(jī)制愈捅,顧名思義遏考,引用計(jì)數(shù)會(huì)跟蹤記錄每個(gè)值被引用的次數(shù),若是為0則清除蓝谨。

var user = {
  name: 'jack',
  age: 20
};  // 引用次數(shù) + 1

// some code ...

user = null;    // 最后定義為null灌具,引用計(jì)數(shù) -1 ,為0清除

但引用計(jì)數(shù)會(huì)因?yàn)樽兞肯嗷ヒ闷┪祝斐蓛?nèi)存計(jì)數(shù)永不為0咖楣,故而雖然已經(jīng)執(zhí)行完了代碼,但是還是不會(huì)清除變量芦昔。

function a(){
  var b = {};
  var c = {};
  b.test = c;
  c.test = b;
}
a(); // 雖然 a 已經(jīng)執(zhí)行完诱贿,但是還是不會(huì)清楚 b 和 c 。

總結(jié)

雖然大多瀏覽器上JavaScript的內(nèi)存管理機(jī)制是標(biāo)記清除咕缎,但是在 IE 瀏覽器(又是它)中珠十,某些對象的內(nèi)存管理機(jī)制是引用計(jì)數(shù),如IE的 DOM和BOM凭豪,(統(tǒng)稱為COM對象)焙蹭,所以在寫代碼時(shí)要避免相互引用。


內(nèi)存泄漏

首先墅诡,內(nèi)存泄漏并不是不合理的壳嚎,如閉包就會(huì)造成內(nèi)存泄漏桐智,但是大家還是在使用閉包的方式寫函數(shù),所以存在即合理烟馅,需要做的说庭,是在合理使用的情況下把不合理的去掉。

常見的造成內(nèi)存泄漏的情況:

  • 定義全局對象
  • 閉包
  • dom清空或刪除時(shí)郑趁,事件未清除
  • 相互引用

由上可知刊驴,基本解決方案就是:

  • 不要輕易定義全局變量
  • 如果有必要,盡量減少閉包函數(shù)寡润。
  • 刪除dom時(shí)捆憎,清除dom以及其子節(jié)點(diǎn)綁定的函數(shù)
  • 不要相互引用,即使要相互引用梭纹,最后請加一個(gè) a = null 切斷聯(lián)系

PS:不是很全面躲惰,要深度研究請網(wǎng)上沖浪,這里僅做一些參考变抽。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末础拨,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子绍载,更是在濱河造成了極大的恐慌诡宗,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,968評(píng)論 6 482
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件击儡,死亡現(xiàn)場離奇詭異塔沃,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)阳谍,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,601評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門蛀柴,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人边坤,你說我怎么就攤上這事名扛×履辏” “怎么了茧痒?”我有些...
    開封第一講書人閱讀 153,220評(píng)論 0 344
  • 文/不壞的土叔 我叫張陵,是天一觀的道長融蹂。 經(jīng)常有香客問我旺订,道長,這世上最難降的妖魔是什么超燃? 我笑而不...
    開封第一講書人閱讀 55,416評(píng)論 1 279
  • 正文 為了忘掉前任区拳,我火速辦了婚禮,結(jié)果婚禮上意乓,老公的妹妹穿的比我還像新娘樱调。我一直安慰自己,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,425評(píng)論 5 374
  • 文/花漫 我一把揭開白布笆凌。 她就那樣靜靜地躺著圣猎,像睡著了一般。 火紅的嫁衣襯著肌膚如雪乞而。 梳的紋絲不亂的頭發(fā)上送悔,一...
    開封第一講書人閱讀 49,144評(píng)論 1 285
  • 那天,我揣著相機(jī)與錄音爪模,去河邊找鬼欠啤。 笑死,一個(gè)胖子當(dāng)著我的面吹牛屋灌,可吹牛的內(nèi)容都是我干的洁段。 我是一名探鬼主播,決...
    沈念sama閱讀 38,432評(píng)論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼共郭,長吁一口氣:“原來是場噩夢啊……” “哼眉撵!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起落塑,我...
    開封第一講書人閱讀 37,088評(píng)論 0 261
  • 序言:老撾萬榮一對情侶失蹤纽疟,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后憾赁,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體污朽,經(jīng)...
    沈念sama閱讀 43,586評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,028評(píng)論 2 325
  • 正文 我和宋清朗相戀三年龙考,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了蟆肆。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,137評(píng)論 1 334
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡晦款,死狀恐怖炎功,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情缓溅,我是刑警寧澤蛇损,帶...
    沈念sama閱讀 33,783評(píng)論 4 324
  • 正文 年R本政府宣布,位于F島的核電站坛怪,受9級(jí)特大地震影響淤齐,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜袜匿,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,343評(píng)論 3 307
  • 文/蒙蒙 一更啄、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧居灯,春花似錦祭务、人聲如沸内狗。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,333評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽其屏。三九已至,卻和暖如春缨该,著一層夾襖步出監(jiān)牢的瞬間偎行,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,559評(píng)論 1 262
  • 我被黑心中介騙來泰國打工贰拿, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留蛤袒,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 45,595評(píng)論 2 355
  • 正文 我出身青樓膨更,卻偏偏與公主長得像妙真,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個(gè)殘疾皇子荚守,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,901評(píng)論 2 345

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