閉包栋荸、堆棧菇怀、深淺克隆

一、閉包

一句話概括專有名詞

閉包函數(shù):聲明在一個(gè)函數(shù)中的函數(shù)叫做閉包函數(shù)晌块。

閉包:內(nèi)部函數(shù)總是可以訪問(wèn)其所在的外部函數(shù)中聲明的參數(shù)或變量爱沟。

閉包的幾個(gè)特點(diǎn)

  • 函數(shù)嵌套函數(shù)
  • 內(nèi)部函數(shù)可以引用外部函數(shù)的參數(shù)和變量
  • 外部函數(shù)的變量會(huì)常駐內(nèi)存中不銷毀

例子

function external(){
    var i = 0;
    function inside(){
        i++;
        console.log(i);
    }
    return inside;
}
var run = external();
run();
run();
run();
var run2 = external();
run2();
run2();
run2();

執(zhí)行結(jié)果:1 2 3 1 2 3

閉包的應(yīng)用場(chǎng)景

function Person(value){
    var name = value;
    this.getName = function(){
        return name;
    }
    this.setName = function(value){
        name = value;
    }
}
var person = new Person('張三');
console.log(person.getName()); // 張三
person.setName('李四');
console.log(person.getName()); // 李四

以上代碼的構(gòu)造函數(shù)中定義了兩個(gè)特權(quán)方法 getName() setName() 這兩個(gè)方法可以通過(guò)對(duì)象訪問(wèn),而且都有權(quán)訪問(wèn)私有變量 name 但是在 Person 外部是無(wú)法訪問(wèn)到 name

二匆背、堆棧

棧內(nèi)存主要用于存儲(chǔ)基本類型的變量呼伸,包括Boolean、Number钝尸、String括享、undefined、null以及對(duì)象變量的指針
堆內(nèi)存主要用于存儲(chǔ)對(duì)象(引用類型值 Object Function)

全局對(duì)象(GO)

var globalObject = {
  Math: {},
  String: {},
  document: {}
  ...
  window: this
}

執(zhí)行上下文棧(ECStack)
執(zhí)行上下文(EC)
. 值存儲(chǔ)區(qū)(變量對(duì)象VO)
. 活動(dòng)對(duì)象(AO)
Scope:作用域珍促,創(chuàng)建函數(shù)的時(shí)候賦值
Scope Chain:作用域鏈

image.png

全局執(zhí)行上下文

  1. 在執(zhí)行全局代碼前將window確定為全局執(zhí)行上下文
  2. 對(duì)全局?jǐn)?shù)據(jù)進(jìn)行預(yù)處理
    var定義的全局變量賦值為undefined奶浦,添加為window的屬性
    function聲明的全局函數(shù)賦值fun,添加為window的方法
    this賦值window
  3. 開(kāi)始執(zhí)行全局代碼

函數(shù)執(zhí)行上下文

  1. 在調(diào)用函數(shù)踢星,準(zhǔn)備執(zhí)行函數(shù)體之前澳叉,創(chuàng)建對(duì)應(yīng)的函數(shù)執(zhí)行上下文對(duì)象
  2. 對(duì)局部數(shù)據(jù)進(jìn)行預(yù)處理
    形參變量賦值實(shí)參,添加為執(zhí)行上下文的屬性
    arguments賦值實(shí)參列表沐悦,添加為執(zhí)行上下文的屬性
    var定義的局部變量賦值undefined成洗,添加為執(zhí)行上下文的屬性
    function聲明的函數(shù)賦值fun,添加為執(zhí)行上下文的方法
    this賦值調(diào)用函數(shù)的對(duì)象
  3. 開(kāi)始執(zhí)行函數(shù)體代碼

1藏否、var 和function聲明創(chuàng)建在全局對(duì)象中瓶殃,而let const class聲明的變量創(chuàng)建在全局scope中
2、先到全局scope中找變量副签,查找不到再到全局對(duì)象中查找

三遥椿、深淺克隆

淺克隆只是克隆了內(nèi)存地址,實(shí)際操作的還是同一塊內(nèi)存空間淆储,所以在克隆后改變值會(huì)影響到被克隆原有的值冠场。

案例

let a = {b: 1}
let c = a
c.b = 3
console.log(a) // {b: 3}
執(zhí)行過(guò)程

那如何才能使變量c新開(kāi)辟一塊兒空間不和a公用呢,這個(gè)時(shí)候就要用深克隆的方式了

let a = {b: 1}
let c = {...a}
c.b = 3
console.log(a) // {b: 1}
console.log(c) // {b: 3}
執(zhí)行過(guò)程

但要注意本砰,上面這只是簡(jiǎn)單的一層對(duì)象的深克隆碴裙,如果我寫成多層對(duì)象,深克隆就失效了。

let a = {b: {c: 1}}
let d = {...a}
d.b.c = 3
console.log(a) // {b: {c: 3}}

那像這種該如何深克隆呢舔株,也有辦法莺琳,先把對(duì)象轉(zhuǎn)換成字符串,然后再轉(zhuǎn)換成對(duì)象载慈。

let a = {b: {c: 1}}
let d = JSON.parse(JSON.stringify(a))
d.b.c = 3
console.log(a) // {b: {c: 1}}
console.log(d) // {b: {c: 3}}

但是這里要注意惭等,JSON.stringify是無(wú)法將function,Data等類型轉(zhuǎn)換成字符串的办铡,如果對(duì)象中包含了這樣的類型值咕缎,JSON.stringify會(huì)過(guò)濾掉這些屬性。要想實(shí)現(xiàn)對(duì)含有特殊類型值的對(duì)象實(shí)現(xiàn)深拷貝料扰,就得使用遞歸凭豪。

function deepClone(obj){
  // 過(guò)濾特殊情況
  if (obj === null) return null;
  if (typeof obj !== 'object') return obj;
  if (obj instanceof RegExp) return new RegExp(obj);
  if (obj instanceof Date) return new Date(obj);
  if (obj instanceof Function) return new Function(obj);
  // 不直接創(chuàng)建空對(duì)象的目的是克隆的結(jié)果和之前保持相同的所屬類
  let newObj = new obj.constructor;
  for (let key in obj) {
    if (obj.hasOwnProperty(key)) {
      newObj[key] = deepClone(obj[key]);
    }
  }
  return newObj;
}
let a = {b: {c: 1},d: function(){}}
let e = deepClone(a)
e.b.c = 3
console.log(a) // {b: {c: 1},d: f()}
console.log(e) // {b: {c: 3},d: f()}
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市晒杈,隨后出現(xiàn)的幾起案子嫂伞,更是在濱河造成了極大的恐慌,老刑警劉巖拯钻,帶你破解...
    沈念sama閱讀 216,324評(píng)論 6 498
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異拼余,居然都是意外死亡匙监,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,356評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)粮揉,“玉大人,你說(shuō)我怎么就攤上這事蝠引≈瘢” “怎么了吊洼?”我有些...
    開(kāi)封第一講書(shū)人閱讀 162,328評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)综液。 經(jīng)常有香客問(wèn)我,道長(zhǎng)附帽,這世上最難降的妖魔是什么蕉扮? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,147評(píng)論 1 292
  • 正文 為了忘掉前任在岂,我火速辦了婚禮洁段,結(jié)果婚禮上祠丝,老公的妹妹穿的比我還像新娘写半。我一直安慰自己叠蝇,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,160評(píng)論 6 388
  • 文/花漫 我一把揭開(kāi)白布铃慷。 她就那樣靜靜地躺著,像睡著了一般洲鸠。 火紅的嫁衣襯著肌膚如雪扒腕。 梳的紋絲不亂的頭發(fā)上瘾腰,一...
    開(kāi)封第一講書(shū)人閱讀 51,115評(píng)論 1 296
  • 那天,我揣著相機(jī)與錄音怪嫌,去河邊找鬼。 笑死噪径,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的车摄。 我是一名探鬼主播吮播,決...
    沈念sama閱讀 40,025評(píng)論 3 417
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼疮胖,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼遮晚!你這毒婦竟也來(lái)了巩梢?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 38,867評(píng)論 0 274
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤括蝠,失蹤者是張志新(化名)和其女友劉穎鞠抑,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體忌警,經(jīng)...
    沈念sama閱讀 45,307評(píng)論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡搁拙,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,528評(píng)論 2 332
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了法绵。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片箕速。...
    茶點(diǎn)故事閱讀 39,688評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖朋譬,靈堂內(nèi)的尸體忽然破棺而出盐茎,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 35,409評(píng)論 5 343
  • 正文 年R本政府宣布,位于F島的核電站顿膨,受9級(jí)特大地震影響捞奕,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜撤嫩,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,001評(píng)論 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧常柄,春花似錦、人聲如沸搀擂。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,657評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)哥倔。三九已至秸架,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間咆蒿,已是汗流浹背东抹。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,811評(píng)論 1 268
  • 我被黑心中介騙來(lái)泰國(guó)打工蚂子, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人缭黔。 一個(gè)月前我還...
    沈念sama閱讀 47,685評(píng)論 2 368
  • 正文 我出身青樓食茎,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親馏谨。 傳聞我的和親對(duì)象是個(gè)殘疾皇子别渔,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,573評(píng)論 2 353

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