JavaScript Fortnight-Diary0:變量、作用域與內(nèi)存

原始值和引用值

除了object外的變量都是原始值牺弹,引用值就是對(duì)象浦马,對(duì)象實(shí)際上保存在內(nèi)存空間时呀,而js不允許訪(fǎng)問(wèn)內(nèi)存空間,因此在對(duì)對(duì)象進(jìn)行任何操作時(shí)捐韩,操作的就是這個(gè)引用(reference)

  • 用new時(shí)有區(qū)別
let name1 = "lpj";
let name2 = new String("lpj")'
name1.age = 19;
name2.age = 19;
console.log(name1.age);//undefined name1類(lèi)型為string
console.log(name2.age);//19 name2類(lèi)型為object
  • 對(duì)象的“復(fù)制”
    把引用值從一個(gè)變量賦給另一個(gè)變量時(shí)退唠,其儲(chǔ)存的值也會(huì)復(fù)制,區(qū)別在于荤胁,這個(gè)值是指向這個(gè)對(duì)象的指針

  • 傳參只傳值不傳引用

        function setName(obj){
            obj.name = "lpj"
            obj = new Object({
                name:"hjy"
            })
        }
        let person = Object()
        setName(person)
        console.log(person.name)//lpj而非hjy

在函數(shù)內(nèi)部 obj和person都指向同一個(gè)對(duì)象瞧预,obj.name = "lpj"可以成功對(duì)這個(gè)對(duì)象進(jìn)行操作,但是obj = new Object后仅政,obj會(huì)被設(shè)置為一個(gè)新的引用值(新指針值)垢油,而非把這個(gè)引用指向一個(gè)新對(duì)象,這說(shuō)明了傳參時(shí)不會(huì)傳引用圆丹,而只是傳了個(gè)指針值滩愁。換句話(huà)說(shuō),跟c++不同辫封,c++傳一個(gè)數(shù)組變量進(jìn)來(lái)硝枉,然后清空,那就是直接清空了倦微。

上下文和作用域鏈 P89

變量或函數(shù)的上下文(即作用域)決定了他們能訪(fǎng)問(wèn)哪些數(shù)據(jù)以及他們的行為
每個(gè)上下文都有一個(gè)關(guān)聯(lián)的變量對(duì)象妻味,這個(gè)上下文中的所有變量和函數(shù)都存在這個(gè)對(duì)象上,這個(gè)以一定順序排列鏈接變量對(duì)象集合就稱(chēng)為作用域鏈欣福,當(dāng)前作用域的變量對(duì)象始終在鏈的最前
這樣就可以按順序去進(jìn)入各個(gè)作用域的變量對(duì)象责球,從而訪(fǎng)問(wèn)數(shù)據(jù)。
舉個(gè)例子說(shuō)明作用域鏈規(guī)則



簡(jiǎn)單來(lái)說(shuō):變量對(duì)象就像一個(gè)個(gè)車(chē)間拓劝,里面按順序裝著不同機(jī)器和原料
(如果是全局變量對(duì)象Windows的話(huà)雏逾,那就是總工廠(chǎng),各種車(chē)間(函數(shù)郑临、對(duì)象)和各種總工廠(chǎng)原料(全局變量)都算是這個(gè)工廠(chǎng)的機(jī)器/原料(屬性))
作用域鏈就像一條單向傳送帶連接不同車(chē)間栖博,從小車(chē)間連向大車(chē)間最終連向總工廠(chǎng)

函數(shù)在創(chuàng)建和執(zhí)行時(shí)發(fā)生了什么?待辦什么是context厢洞,https://blog.csdn.net/konglingyuan/article/details/51441829

  • 創(chuàng)建時(shí):創(chuàng)建Function對(duì)象的內(nèi)部屬性[[scope]]仇让,包含了一個(gè)函數(shù)當(dāng)前作用域中對(duì)象的集合,即當(dāng)前作用域的變量對(duì)象(是嗎)犀变,這個(gè)集合就是函數(shù)的作用域鏈

它決定哪些數(shù)據(jù)可以被函數(shù)所訪(fǎng)問(wèn)妹孙,它將把自己完全復(fù)制到執(zhí)行環(huán)境的作用域鏈中

  • 執(zhí)行時(shí):為函數(shù)創(chuàng)建一個(gè)執(zhí)行環(huán)境(execution context)內(nèi)部對(duì)象
    該對(duì)象與函數(shù)一一對(duì)應(yīng)秋柄,會(huì)重復(fù)創(chuàng)建获枝,執(zhí)行完畢即銷(xiāo)毀
  • 為執(zhí)行環(huán)境初始化作用域鏈,初始化為當(dāng)前函數(shù)的[scope]](即函數(shù)的作用域鏈)的對(duì)象

注意 這里的作用域鏈不是上面的函數(shù)的作用域鏈骇笔,而是屬于環(huán)境的省店,用于解析標(biāo)識(shí)符

  • 至此嚣崭,活動(dòng)對(duì)象創(chuàng)建完畢,成為函數(shù)運(yùn)行時(shí)的一個(gè)變量對(duì)象

  • 作用域鏈增強(qiáng)
    指原本作用鏈前端對(duì)應(yīng)的變量對(duì)象被換成了別的變量對(duì)象
    try/catch的catch(創(chuàng)建新的變量對(duì)象)以及with語(yǔ)句(挪動(dòng)變量對(duì)象到最前端)

  • 變量的作用域聲明

    • var
      在函數(shù)里var name懦傍,外面訪(fǎng)問(wèn)不到雹舀,因?yàn)檫@個(gè)變量被添加到這個(gè)函數(shù)上下文的變量對(duì)象當(dāng)中了但是如果不var,直接寫(xiě)name粗俱,會(huì)自動(dòng)添加為全局變量说榆,放在全局變量對(duì)象當(dāng)中
      • 提升(有點(diǎn)抽象)
        var name = "lpj" 等價(jià)于 name = "lpj"; var name
        也就是說(shuō) var在執(zhí)行的時(shí)候,這個(gè)聲明會(huì)被提升到頂端(函數(shù)頂端或全局頂端)寸认,但是這個(gè)賦值卻不會(huì) 舉例:
console.log(name)//undefined
var name = 'lpj'//聲明被提升 但是賦值沒(méi)被提升
  • let
    塊作用域:指最近的一堆{}就是一個(gè)塊签财,這解釋了為什么使用let可以防止for語(yǔ)句的i泄露出去

  • 標(biāo)識(shí)符查找 P93
    就是指沿著作用域鏈搜索這個(gè)變量的過(guò)程,如果在當(dāng)前作用域找到了color = ''blue''查找即停止偏塞,在父級(jí)的color = "green"就不會(huì)生效

內(nèi)存與性能P95

  • 垃圾回收
    每隔一段時(shí)間判定哪個(gè)變量不會(huì)再使用了唱蒸,就釋放它的內(nèi)存
  • 性能
    手動(dòng)解除引用灸叼,即設(shè)為null神汹,能確保下次垃圾回收時(shí)被成功回收而非馬上被回收
    • 函數(shù)內(nèi)局部變量會(huì)自動(dòng)被解除引用
    • 由于let和const以塊(而非函數(shù))為作用域,可能會(huì)更早地接觸引用從而回收
    • 隱藏類(lèi)的利用
    • 內(nèi)存泄露(待辦)https://www.cnblogs.com/princeness/p/11664978.html
      內(nèi)存泄露是指你用不到(訪(fǎng)問(wèn)不到)的變量古今,依然占居著內(nèi)存空間屁魏,不能被再次利用起來(lái)。
      在某些環(huán)境中沧卢,這個(gè)閉包會(huì)導(dǎo)致內(nèi)存泄露蚁堤,即largeObject不能被及時(shí)回收
function outer() {
    var largeObject = LargeObject.fromSize('100MB');
  
    return function() {
        console.log('inner');
    };
}
var inner = outer();

遺留問(wèn)題:閉包為什么能會(huì)使內(nèi)存常駐,為什么能解決這里最后for循環(huán)的問(wèn)題

高性能

管理作用域

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末但狭,一起剝皮案震驚了整個(gè)濱河市披诗,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌立磁,老刑警劉巖呈队,帶你破解...
    沈念sama閱讀 212,454評(píng)論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異唱歧,居然都是意外死亡宪摧,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,553評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門(mén)颅崩,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)几于,“玉大人,你說(shuō)我怎么就攤上這事沿后⊙嘏恚” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 157,921評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵尖滚,是天一觀(guān)的道長(zhǎng)喉刘。 經(jīng)常有香客問(wèn)我瞧柔,道長(zhǎng),這世上最難降的妖魔是什么睦裳? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 56,648評(píng)論 1 284
  • 正文 為了忘掉前任造锅,我火速辦了婚禮,結(jié)果婚禮上廉邑,老公的妹妹穿的比我還像新娘哥蔚。我一直安慰自己,他們只是感情好蛛蒙,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,770評(píng)論 6 386
  • 文/花漫 我一把揭開(kāi)白布肺素。 她就那樣靜靜地躺著,像睡著了一般宇驾。 火紅的嫁衣襯著肌膚如雪倍靡。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 49,950評(píng)論 1 291
  • 那天课舍,我揣著相機(jī)與錄音塌西,去河邊找鬼。 笑死筝尾,一個(gè)胖子當(dāng)著我的面吹牛捡需,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播筹淫,決...
    沈念sama閱讀 39,090評(píng)論 3 410
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼站辉,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了损姜?” 一聲冷哼從身側(cè)響起饰剥,我...
    開(kāi)封第一講書(shū)人閱讀 37,817評(píng)論 0 268
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎摧阅,沒(méi)想到半個(gè)月后汰蓉,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,275評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡棒卷,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,592評(píng)論 2 327
  • 正文 我和宋清朗相戀三年顾孽,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片比规。...
    茶點(diǎn)故事閱讀 38,724評(píng)論 1 341
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡若厚,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出蜒什,到底是詐尸還是另有隱情测秸,我是刑警寧澤,帶...
    沈念sama閱讀 34,409評(píng)論 4 333
  • 正文 年R本政府宣布,位于F島的核電站乞封,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏岗憋。R本人自食惡果不足惜肃晚,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 40,052評(píng)論 3 316
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望仔戈。 院中可真熱鬧关串,春花似錦、人聲如沸监徘。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,815評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)凰盔。三九已至墓卦,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間户敬,已是汗流浹背落剪。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,043評(píng)論 1 266
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留尿庐,地道東北人忠怖。 一個(gè)月前我還...
    沈念sama閱讀 46,503評(píng)論 2 361
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像抄瑟,于是被迫代替她去往敵國(guó)和親凡泣。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,627評(píng)論 2 350

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