夯實(shí)JS系列--變量窍帝、作用域和內(nèi)存問題

最近在忙于寫一個(gè)react+node的全棧博客demo,沒有時(shí)間更新文章。但是還是覺得這樣一忙起來不更新是不應(yīng)該的诽偷。正好在空閑上下班地鐵上都會(huì)再去細(xì)讀js原生知識(shí)坤学。所以打算整理、總結(jié)报慕、系統(tǒng)性的分享給大家深浮。

基本類型和引用類型

在ECMAScript中,變量分為基本類型和引用類型兩種眠冈。 基本類型就是存儲(chǔ)簡單的數(shù)據(jù)段飞苇。而引用類型指的是那些可能由多個(gè)值構(gòu)成的對象。 在ECMAScript中蜗顽,基本類型包括:Undefined玄柠、Null、Boolean诫舅、Number和String羽利。 這些基本類型的對象都是按值訪問的。所以js中我們可以直接操作他們刊懈。 但是引用類型如Object等这弧,是按照引用來操作的。并非直接操作其值虚汛。 并且我們可以動(dòng)態(tài)的為引用類型變量添加屬性和方法匾浪。而基本類型則不可以。

變量賦值和傳參

這里其實(shí)對于基本類型來說沒有什么需要重點(diǎn)說明的卷哩。這里就重點(diǎn)說下引用類型吧

對于賦值

functionsetName(obj) {obj.name="Neal";? obj=newObject();obj.name="yang";}varperson=newObject();setName(person);console.log(person.name);

如上代碼蛋辈,最后console出來的是Neal。

這段代碼說明兩點(diǎn):

引用類型在傳參的時(shí)候,是按照引用傳遞的冷溶,不然不可能person.name為Neal

即使在函數(shù)內(nèi)部修改了參數(shù)的值渐白。原始的引用依然不變。實(shí)際上逞频,在重寫obj的時(shí)候纯衍,這個(gè)變量的引用已經(jīng)是一個(gè)局部變量了。只是在這兒函數(shù)運(yùn)行完苗胀,這個(gè)對象被銷毀了襟诸。

所以說到這,對于對象的賦值基协,一句以概之:引用的賦值歌亲。

執(zhí)行環(huán)境及其作用域

這大概是一個(gè)非常基礎(chǔ)也是重要的部分澜驮,后續(xù)會(huì)在進(jìn)階里面詳細(xì)展開应结。

執(zhí)行環(huán)境定義了變量或者函數(shù)有權(quán)訪問的其他數(shù)據(jù),決定了他們的行為泉唁。每一個(gè)執(zhí)行環(huán)境都有一個(gè)與之關(guān)聯(lián)的變量對象(如global鹅龄、window)。環(huán)境中定義的所有變量和函數(shù)都保存在這個(gè)對象中亭畜。

某一個(gè)執(zhí)行環(huán)境執(zhí)行完畢后扮休,該環(huán)境會(huì)被銷毀。其中的所有的變量和函數(shù)也將隨之銷毀拴鸵。全局執(zhí)行環(huán)境知道應(yīng)用程序退出才被銷毀(如關(guān)閉網(wǎng)頁等)

當(dāng)代碼在一個(gè)環(huán)境中執(zhí)行的時(shí)候玷坠,會(huì)創(chuàng)建變量對象的一個(gè)作用域鏈。作用域鏈的用途劲藐,是保證對執(zhí)行環(huán)境有權(quán)訪問的變量和函數(shù)的有序訪問八堡。作用域鏈的前端,始終是當(dāng)前執(zhí)行的代碼所在的 環(huán)境的變量對象聘芜。全局執(zhí)行環(huán)境始終是作用域鏈的最后一個(gè)對象兄渺。

標(biāo)識(shí)符的解析也就是沿著作用域鏈一級(jí)一級(jí)的搜索的過程。搜索過程從作用域鏈的前端開始汰现,然后逐級(jí)向后回溯挂谍。知道找到標(biāo)識(shí)符為止。

varcolor='red';functionchangeColor() {varanotherColor='blue';functionswapColors() {vartempColor=anotherColor;? ? anotherColor=color;? ? color=tempColor;//這個(gè)執(zhí)行環(huán)境中可以訪問到 tempColor color antherColor}//這里只能訪問anotherColor colorswapColors();}changeColor();//這里只能訪問color

所以從上面代碼我們可以感受到:內(nèi)部環(huán)境可以通過作用域鏈訪問到外部環(huán)境的變量瞎饲。反之不可口叙。這些環(huán)境之間的聯(lián)系都是線性、有次序的嗅战。

延長作用域鏈

雖然執(zhí)行環(huán)境的類型只有兩種妄田。局部的和全局的。但是還有一種方法可以延長作用域鏈。

這是因?yàn)橛行┱Z句可以在作用域鏈的前端臨時(shí)添加一個(gè)變量對象疟呐,改變量對象會(huì)在代碼執(zhí)行后被移除脚曾。

try-catch 語句中的catch

with語句

對于width語句而言,會(huì)將指定的對象添加到作用域鏈中萨醒。對于catch語句而言斟珊,會(huì)創(chuàng)建一個(gè)新的變量對象苇倡,其中包含被拋出的錯(cuò)誤對象的申明富纸。

關(guān)于作用域、環(huán)境之類的話題后續(xù)會(huì)再細(xì)說旨椒。這里作為基礎(chǔ)篇晓褪,就先介紹到這里。

垃圾收集

很開心js不需要你來收拾垃圾综慎!好此篇完結(jié)涣仿!

好吧~雖然我們不收拾垃圾,但是也是要稍微了解下js是如何收拾垃圾的示惊。

首先什么是垃圾:哪些不再被繼續(xù)使用的變量都是垃圾好港。什么叫收拾?釋放起垃圾所占用的空間即為釋放米罚。

局部變量只在函數(shù)執(zhí)行過過程中存在钧汹。而在這個(gè)過程中,會(huì)為局部變量在椔荚瘢或者堆中分配相應(yīng)的內(nèi)存空間(存值唄)拔莱。然后函數(shù)執(zhí)行啦,用了這些變量隘竭,執(zhí)行完啦塘秦。完啦!則這些變量就沒有用了动看。沒用了尊剔,則為垃圾,既需清理菱皆。

但是并非所有的情況下都這么容易的得出結(jié)論赋兵。垃圾收集器必須跟蹤哪個(gè)變量用了哪個(gè)變量沒用。對于不在利用的打上標(biāo)記搔预,已被將來收回其所占用的內(nèi)存霹期。

標(biāo)記清除

這是最為常用一種清除方式。當(dāng)一個(gè)變量進(jìn)入到環(huán)境的時(shí)候拯田,標(biāo)記為‘進(jìn)入環(huán)境’历造,這個(gè)基本是不會(huì)被清除的,因?yàn)閳?zhí)行流進(jìn)入到相應(yīng)的環(huán)境的時(shí)候可能會(huì)用到。當(dāng)變量離開環(huán)境的時(shí)候吭产,標(biāo)記為‘離開環(huán)境’侣监。

可以使用任何方式來標(biāo)記。我們要知道是如何標(biāo)記不重要臣淤,重要的是采用什么策略橄霉。

垃圾收集器在運(yùn)行的時(shí)候會(huì)給存儲(chǔ)在內(nèi)存中的所有變量都加上標(biāo)記。他會(huì)去掉環(huán)境中的變量以及被環(huán)境中的變量所引用的變量的標(biāo)記邑蒋。剩下的姓蜂,則視為嫌疑人,準(zhǔn)備刪除医吊。因?yàn)榄h(huán)境中的變量已經(jīng)無法訪問到這些變量了钱慢。目前IE、ff 卿堂、 opera 束莫、 chrome都是這種標(biāo)記清除方式

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

因?yàn)椴怀S茫唵握f下

引用計(jì)數(shù)的意思就是跟蹤記錄每一個(gè)值被引用的次數(shù)草描。當(dāng)一個(gè)引用類型的變量復(fù)制給一個(gè)變量的時(shí)候览绿,這個(gè)引用次數(shù)則+1,如果有別復(fù)制給另一個(gè)變量穗慕,則再+1饿敲,如果包含對這個(gè)值的引用的變量又被賦值了別的值。則這個(gè)值-1.

當(dāng)引用次數(shù)為0的時(shí)候揍诽,為垃圾~回收诀蓉!

為什么不常用呢?看著也很清晰笆畲唷渠啤!

look code:

functiontest() {varobjectA=newObject();varobjectB=newObject();objectA.someOtherObject=objectB;objectB.someOtherObject=objectA;}

如上,對象A和對象B的屬性互相引用添吗。也就是說沥曹,這兩個(gè)對象的引用次數(shù)永遠(yuǎn)都是2.哪怕這個(gè)函數(shù)執(zhí)行完咯,也沒法清理的碟联。對的妓美,這就是bug~

節(jié)制點(diǎn)~你懂得

雖然垃圾回收機(jī)制幫我們做了很多事,但是電腦分配給瀏覽器的可用內(nèi)存通常要比桌面應(yīng)用的內(nèi)存要小的多鲤孵,畢竟是為了防止運(yùn)行js的網(wǎng)頁耗盡所有的內(nèi)存而導(dǎo)致系統(tǒng)崩潰的問題發(fā)生壶栋。

所以我們確保用最少的內(nèi)存可以讓頁面獲取最好的性能,最佳的執(zhí)行方案就是執(zhí)行中的代碼都是有必要的數(shù)據(jù)普监。就好比用最低的經(jīng)濟(jì)拿最多的人頭一樣贵试,一旦經(jīng)濟(jì)不夠琉兜,技術(shù)彌補(bǔ)!一旦數(shù)據(jù)不要用了毙玻,自己主動(dòng)掃除豌蟋。

functioncreatePerson(name) {varlocalPerson=newObject();localPerson.name=name;returnlocalPerson;}varneal=createPerson('Neal');//主動(dòng)清理垃圾createPerson=null;

這里講createPerson設(shè)置為null,并沒有就把他給清除了桑滩,只是釋放了他的引用梧疲。讓其脫離其執(zhí)行環(huán)境,以便于垃圾收集器更快的將其回收运准。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末幌氮,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子戳吝,更是在濱河造成了極大的恐慌浩销,老刑警劉巖贯涎,帶你破解...
    沈念sama閱讀 211,265評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件听哭,死亡現(xiàn)場離奇詭異,居然都是意外死亡塘雳,警方通過查閱死者的電腦和手機(jī)陆盘,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,078評論 2 385
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來败明,“玉大人隘马,你說我怎么就攤上這事∑薅ィ” “怎么了酸员?”我有些...
    開封第一講書人閱讀 156,852評論 0 347
  • 文/不壞的土叔 我叫張陵,是天一觀的道長讳嘱。 經(jīng)常有香客問我幔嗦,道長,這世上最難降的妖魔是什么沥潭? 我笑而不...
    開封第一講書人閱讀 56,408評論 1 283
  • 正文 為了忘掉前任邀泉,我火速辦了婚禮,結(jié)果婚禮上钝鸽,老公的妹妹穿的比我還像新娘汇恤。我一直安慰自己,他們只是感情好拔恰,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,445評論 5 384
  • 文/花漫 我一把揭開白布因谎。 她就那樣靜靜地躺著,像睡著了一般颜懊。 火紅的嫁衣襯著肌膚如雪财岔。 梳的紋絲不亂的頭發(fā)上阱穗,一...
    開封第一講書人閱讀 49,772評論 1 290
  • 那天,我揣著相機(jī)與錄音使鹅,去河邊找鬼揪阶。 笑死,一個(gè)胖子當(dāng)著我的面吹牛患朱,可吹牛的內(nèi)容都是我干的鲁僚。 我是一名探鬼主播,決...
    沈念sama閱讀 38,921評論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼裁厅,長吁一口氣:“原來是場噩夢啊……” “哼冰沙!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起执虹,我...
    開封第一講書人閱讀 37,688評論 0 266
  • 序言:老撾萬榮一對情侶失蹤拓挥,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后袋励,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體侥啤,經(jīng)...
    沈念sama閱讀 44,130評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,467評論 2 325
  • 正文 我和宋清朗相戀三年茬故,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了盖灸。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,617評論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡磺芭,死狀恐怖赁炎,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情钾腺,我是刑警寧澤徙垫,帶...
    沈念sama閱讀 34,276評論 4 329
  • 正文 年R本政府宣布,位于F島的核電站放棒,受9級(jí)特大地震影響姻报,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜哨查,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,882評論 3 312
  • 文/蒙蒙 一逗抑、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧寒亥,春花似錦邮府、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,740評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至加勤,卻和暖如春仙辟,著一層夾襖步出監(jiān)牢的瞬間同波,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,967評論 1 265
  • 我被黑心中介騙來泰國打工叠国, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留未檩,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 46,315評論 2 360
  • 正文 我出身青樓粟焊,卻偏偏與公主長得像冤狡,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個(gè)殘疾皇子项棠,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,486評論 2 348

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