? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?棧內(nèi)存存取示意圖
棧內(nèi)存的存取方法就好像一個兵乓球盒子独郎,第5 個球肯定是最后放入的,也是要最先使用的枚赡,如果要使用第1個球氓癌,那要先將第一個球上面的所有球釋放使用掉。棧內(nèi)存的使用方式是"先進后出贫橙,后進的先出"贪婉。
堆內(nèi)存的方式就好像書和書架的關(guān)系,只要知道書的名字卢肃,就可以自由去書架上尋找相對應(yīng)的書疲迂。
基本數(shù)據(jù)類型和引用數(shù)據(jù)類型
js有六種基本數(shù)據(jù)類型,分別為:String莫湘,Number尤蒿,Boolean,Null逊脯,Undefined优质。基本數(shù)據(jù)類型是按值來保存的,所以我們可以直接操作保存在變量當(dāng)中的基礎(chǔ)對象的值巩螃。
js有三種引用數(shù)據(jù)類型演怎,分別為:Object,Function,Array.引用類型是按堆內(nèi)存來保存的,變量保存一個引用數(shù)據(jù)類型會將值保存到堆內(nèi)存當(dāng)中避乏。js不允許直接操作保存在堆內(nèi)存當(dāng)中的值爷耀,所以我們實際操作的是堆內(nèi)存的一個引用而已。所以我們操作一個引用類型的值時拍皮,是先獲取它保存在堆內(nèi)存當(dāng)中的引用歹叮,然后根據(jù)引用去獲取堆內(nèi)存的值。
執(zhí)行上下文
js當(dāng)中當(dāng)遇到一個可執(zhí)行的代碼塊時铆帽,會進入一個執(zhí)行上下文咆耿,意思就是它的當(dāng)前的可執(zhí)行壞境。也就是會創(chuàng)建一個作用域爹橱∪荩可執(zhí)行的代碼塊有三種情況
1;全局環(huán)境 ? //當(dāng)執(zhí)行代碼時愧驱,最先進入全局環(huán)境
2慰技;函數(shù)環(huán)境 ?//當(dāng)一個函數(shù)被調(diào)用執(zhí)行時,會進入它的局部函數(shù)環(huán)境
3组砚;evel吻商;
當(dāng)代碼在執(zhí)行過程中,遇到以上三種情況時糟红,會進入一個執(zhí)行上下文艾帐,將其放入棧中,當(dāng)處于棧頂中的執(zhí)行上下文執(zhí)行完畢后改化,會從棧中彈出掩蛤。以下是例子
上面的例子中,首先入棧的是全局環(huán)境陈肛,然后執(zhí)行中碰到了changeColor函數(shù),然后changeColor入棧兄裂,
然后執(zhí)行changgeClolor函數(shù)的時候碰到了swap函數(shù)句旱,swap函數(shù)入棧。當(dāng)swap函數(shù)執(zhí)行完畢后晰奖,出棧谈撒,然后changeColor函數(shù)出棧。當(dāng)瀏覽器關(guān)閉之后匾南,全局環(huán)境出棧啃匿。
注意,函數(shù)當(dāng)遇到return時,會直接將當(dāng)前上下文彈出棧溯乒。不會繼續(xù)執(zhí)行
執(zhí)行上下文的幾個關(guān)鍵點
1夹厌,全局上下文只有一個,
2裆悄;單線程
3矛纹,函數(shù)的執(zhí)行上下文是沒有個數(shù)限制的
4,當(dāng)一個函數(shù)執(zhí)行時光稼,會創(chuàng)建一個執(zhí)行上下文或南,即使時它自己本身的函數(shù)被調(diào)用。