摘要:具體來說就是當(dāng)執(zhí)行流進(jìn)入下列任何一個語句時,作用域鏈就會得到加長語句的塊和語句。這兩個語句都會在作用域鏈的前端添加一個變量對象。對來說,會將指定的對象添加到作用域鏈中。
1. 基本類型和引用類型的值
JavaScript變量可以用來保存兩種類型的值:基本類性值和引用類性值?;绢愋椭翟醋砸韵?種基本數(shù)據(jù)類型:Undefined、Null、Boolean、Number和String?;绢愋椭岛鸵妙愋灾涤幸韵绿攸c:
基本類型值在內(nèi)存空間中占據(jù)固定大小的空間,因此會被保存在棧內(nèi)存中;
從一個變量向另一個變量復(fù)制基本類型的值,會創(chuàng)建這個值的一個副本;
引用類型的值是對象,保存在堆內(nèi)存中; 包含引用類型值的變量實際上包含的并不是對象本身,而是一個指向該對象的指針;
從一個變量向另一個變量復(fù)制引用類型的值,復(fù)制的其實是指針,因此兩個變量最終都指向同一個對象
確定一個值是哪種基本類型可以使用typeof操作符,而確定一個值是哪種引用類型可以使用instanceof操作符。
6、 只能給引用類型值動態(tài)地添加屬性
7、如果從一個變量向另一個變量復(fù)制基本類型的值,會在變量的對象上創(chuàng)建一個新值,然后把該值復(fù)制到為新變量分配的位置上;
8、當(dāng)從一個變量向另一變量復(fù)制引用類型的值時,同樣也會將存儲在變量對象中的值復(fù)制一份放到為新變量分配的空間中。不同的是,這個值的副本實際上是一個指針,兩個變量實際上將引用一個對象。因此,改變其中一個變量就會影響另一變量。
2. 執(zhí)行環(huán)境及作用域所有變量(包括基本類型和引用類型)都存在于一個執(zhí)行環(huán)境(也稱為作用域)當(dāng)中,這個執(zhí)行環(huán)境決定了變量的生命周期,以及哪一部分代碼可以訪問其中的變量。以下是關(guān)于執(zhí)行環(huán)境的幾點總結(jié):
執(zhí)行環(huán)境有全局執(zhí)行環(huán)境(也稱全局環(huán)境)和函數(shù)執(zhí)行環(huán)境之分;
每次進(jìn)入一個新執(zhí)行環(huán)境,都會創(chuàng)建一個用于搜索變量和函數(shù)的作用域鏈;
函數(shù)的局部環(huán)境變量不僅有權(quán)訪問函數(shù)作用域中的變量,而且有權(quán)訪問其包含(父)環(huán)境,乃至全局環(huán)境;
延長作用域鏈:有些語句可以在作用鏈的前端臨時增加一個變量對象,該變量對象會在代碼執(zhí)行后被移除。具體來說就是當(dāng)執(zhí)行流進(jìn)入下列任何一個語句時,作用域鏈就會得到加長:try-catch語句的catch塊和with語句。這兩個語句都會在作用域鏈的前端添加一個變量對象。對with來說,會將指定的對象添加到作用域鏈中。對catch語句來說,會創(chuàng)建一個新的變量對象。
全局環(huán)境只能訪問在全局環(huán)境中定義的變量和函數(shù),而不能直接訪問局部環(huán)境中的任何數(shù)據(jù);(如果局部環(huán)境中存在著同名標(biāo)識符,就不會使用位于父環(huán)境中的標(biāo)識符)
變量的執(zhí)行環(huán)境有助于確定應(yīng)該何時釋放內(nèi)存;
使用var聲明的變量會自動被添加到最接近的環(huán)境中。如過初始化變量時沒有使用var聲明,該變量會自動被添加到全局環(huán)境中。
3. 垃圾收集JavaScript是一門具有自動垃圾收集機制的編程語言,開發(fā)人員不必關(guān)心內(nèi)存分配和回收問題??梢詫avaScript的垃圾收集歷程做如下總結(jié):
離開作用域的值將被自動標(biāo)記為可以回收,因此將在垃圾收集期間被刪除;
"標(biāo)記清除"是目前主流的垃圾收集算法。這種算法的思想是給當(dāng)前不使用的值加上標(biāo)記,然后再回收其內(nèi)存;
另一種垃圾收集算法是“引用計數(shù)”,這種算法的思想是跟蹤記錄所有值被引用的次數(shù)。JavaScript引擎目前都不再使用這種算法;但在IE中訪問非原生JavaScript對象(如DOM元素)時,這種算法仍然可能會導(dǎo)致問題;
當(dāng)代碼中存在循環(huán)引用現(xiàn)象時,“引用計數(shù)”算法就會導(dǎo)致問題;
循環(huán)引用指的是的對象A中包含一個指向?qū)ο驜的指針,而對象B中也包含一個指向?qū)ο驛的引用;
(1)解決辦法:在不使用它們的時候手工斷開原生JavaScript對象與DOM元素之間的連接
myObject.element = null;
element.someObject = null;
(2)將變量設(shè)置為null意味著切斷變量與它此前引用的值之間的連接。當(dāng)垃圾收集器下次運行時,就會刪除這 些值并回收它們所占的內(nèi)存
解除變量的引用不僅有助于消除循環(huán)引用現(xiàn)象,而且對垃圾收集也有好處。為了確保有效地回收內(nèi)存,應(yīng)該及時解除不再使用的全局對象,全局對象屬性以及循環(huán)引用變量的引用;
(1)優(yōu)化內(nèi)存占用的最佳方式,就是為執(zhí)行中的代碼只保存必要的數(shù)據(jù)。一旦數(shù)據(jù)不再有用,最好通過將其設(shè)置為null來釋放其引用——這個做法叫做解除引用。
(2)解除引用的真正作用是讓值脫離執(zhí)行環(huán)境,以便垃圾收集器下次運行時將其回收。
標(biāo)記清除
- 給存儲在內(nèi)存中的所有變量都加上標(biāo)記,然后,它會去掉環(huán)境中的變量以及被環(huán)境中的變量引用的變量的標(biāo)記。而在此之后再被加上標(biāo)記的變量將被視為準(zhǔn)備刪除的變量。最后,垃圾收集器完成內(nèi)存清除工作,銷毀那些帶標(biāo)記的值并回收它們所占用的內(nèi)存空間。
引用計數(shù)
- 當(dāng)聲明了一個變量并將一個引用類性值賦給該變量時,則這個值的引用次數(shù)就是1.如果同一個值又被賦值給另一個變量,則該值的引用次數(shù)加1。相反,如果包含對這個值引用的變量又取得了另一個值,則這個值的引用次數(shù)減1。當(dāng)這個值的引用次數(shù)變成0時,則說明沒有辦法再訪問這個值了,因而就可以將其占用的內(nèi)存空間回收回來。
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/102385.html
摘要:遞歸閉包模仿塊級作用域私有變量小結(jié)在編程中,使用函數(shù)表達(dá)式可以無需對函數(shù)命名,從而實現(xiàn)動態(tài)編程。匿名函數(shù)也稱為拉姆達(dá)函數(shù)。函數(shù)聲明要求有名字,但函數(shù)表達(dá)式不需要。中的函數(shù)表達(dá)式和閉包都是極其有用的特性,利用它們可以實現(xiàn)很多功能。 1、遞歸 2、閉包 3、模仿塊級作用域 4、私有變量 5、小結(jié) 在JavaScript編程中,使用函數(shù)表達(dá)式可以無需對函數(shù)命名,從而實現(xiàn)動態(tài)編程。匿名函數(shù)也稱...
摘要:具體說就是執(zhí)行流進(jìn)入下列任何一個語句時,作用域鏈就會得到加長語句的塊。如果局部環(huán)境中存在著同名的標(biāo)識符,就不會使用位于父環(huán)境中的標(biāo)識符訪問局部變量要比訪問全局變量更快,因為不用向上搜索作用域鏈。 基本類型和引用類型的值 ECMAscript變量包含 基本類型值和引用類型值 基本類型值值的是基本數(shù)據(jù)類型:Undefined, Null, Boolean, Number, String ...
摘要:寫在前面本文記錄的是我不熟悉或者我認(rèn)為值得注意的地方,并不是書上知識點的概括第章變量作用域和內(nèi)存問題對象是按引用傳遞的我理解的是傳值其實傳的是一個指針,該指針指向內(nèi)存中的某個對象。 寫在前面 本文記錄的是我不熟悉或者我認(rèn)為值得注意的地方,并不是書上知識點的概括 第4章 變量、作用域和內(nèi)存問題 對象是按引用傳遞的(我理解的是傳值其實傳的是一個指針,該指針指向內(nèi)存中的某個對象)。舉例如下...
摘要:當(dāng)代碼在一個環(huán)境中執(zhí)行時,會創(chuàng)建變量對象的一個作用域鏈。作用域鏈的用途,是保證對執(zhí)行環(huán)境有權(quán)訪問的所有變量和函數(shù)的有序訪問。這樣,一直延續(xù)到全局執(zhí)行環(huán)境全局執(zhí)行環(huán)境的變量對象始終都是作用域鏈中的最后一個對象。 變量、作用域和內(nèi)存問題 基本類型和引用類型的值 基本類型值指的是簡單的數(shù)據(jù)段,而引用類型值值那些可能由多個值構(gòu)成的對象。 定義基本類型值的引用和引用類型值的方法是類似的,創(chuàng)建...
閱讀 2866·2021-10-21 09:38
閱讀 2764·2021-10-11 10:59
閱讀 3057·2021-09-27 13:36
閱讀 1673·2021-08-23 09:43
閱讀 806·2019-08-29 14:14
閱讀 3044·2019-08-29 12:13
閱讀 3212·2019-08-29 12:13
閱讀 319·2019-08-26 12:24