摘要:當代碼在一個環(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)建一個變量并為該變量賦值。對于引用類型的值我們可以為其添加屬性和方法,也可以改變屬性和方法。不能給基本類型的值添加屬性。
var person=new Object(); person.name="Nicholas"; alert(person.name);//"Nicholas" var name="Nicolas"; name.age=27; alert(name.age);//undefined
如果從一個變量向另一個變量賦值基本類型的值,會在變量對象上創(chuàng)建一個新值,然后把該值復制到為新變量分配的位置上。當從一個變量向另一個變量復制引用類型的值時,同樣也會將存儲在變量中的值復制一份放到為新變量分配的空間中。不同的是,這個值的副本實際上是一個指針,而這個指針指向存儲在堆中的一個對象。復制操作結(jié)束后,兩個變量實際上將引用同一個對象。因此改變其中一個變量就會影響另一個變量。
var num1=5; var num2=num1; var obj1=new Object(); var obj2=obj1; obj1.name="Nicholas"; alert(obj2.name);//"Nicholas";
所有函數(shù)的參數(shù)都是按值傳遞的。
在向參數(shù)傳遞羈絆類型的值時,被傳遞的值會被復制給一個局部變量,在向參數(shù)出傳遞引用類型的值時,會把這個值在內(nèi)存中的地址復制給一個局部變量,因此這個局部變量的變化會反映在函數(shù)的外部。
function addTen(num){ num+=10; return num; } var count=20; var result=addTen(count); alert(count);//沒有變化 alert(result);//30 function setName(obj){ obj.name="Nicholas"; } var person=new Object(); setName(person); alert(person.name);//"Nicholas" function setName(obj){ obj.name="Nicholas"; obj=new Object(); obj.name="Greg"; } var person=new Object; setName(person); alert(person.name);//"Nicholas"
typeof操作符是卻行一個變量是字符串、數(shù)值、布爾值還是undefined的最佳工具
var a="Nicholas"; var b=true; var i=22; var u; var n=null; var o=new Object(); alert(typeof a);//string alert(typeof i);//number alert(typeof b);//boolean alert(typeof u);//undefined alert(typeof n);//object alert(typeof o);//object
監(jiān)測應用類型的值時,這個操作符用處不大。ECMAScript提供了instanceof操作符。
alert(person instanceof Object)//變量person是Object么? alert(colors instanceof Array)//變量color是Array么? alert(pattern instanceof RegExp)//變量pattern是RegExp么?執(zhí)行環(huán)境及作用域
執(zhí)行環(huán)境定義了變量或函數(shù)有權(quán)訪問的其他數(shù)據(jù),決定了它們各自的行為。每個執(zhí)行環(huán)境都有一個與之關(guān)聯(lián)的變量對象,環(huán)境中定義的所有變量和函數(shù)都保存在這個對象中。
全局執(zhí)行環(huán)境是最外圍的一個執(zhí)行環(huán)境
每個函數(shù)都有自己的執(zhí)行環(huán)境。當執(zhí)行流進入一個函數(shù)時,函數(shù)的花名就會被推入一個環(huán)境棧中。而在函數(shù)執(zhí)行之后,棧將其環(huán)境彈出,把控制權(quán)返回給之前的執(zhí)行環(huán)境。
當代碼在一個環(huán)境中執(zhí)行時,會創(chuàng)建變量對象的一個作用域鏈。
作用域鏈的用途,是保證對執(zhí)行環(huán)境有權(quán)訪問的所有變量和函數(shù)的有序訪問。
作用域鏈的前端,始終都是當前執(zhí)行的代碼所在環(huán)境的變量對象。如果這個環(huán)境是函數(shù),則將其活動對象作為變量對象。
作用域鏈中的下一個變量對象來自包含環(huán)境,而再下一個變量對象則來自下一個包含環(huán)境。這樣,一直延續(xù)到全局執(zhí)行環(huán)境;全局執(zhí)行環(huán)境的變量對象始終都是作用域鏈中的最后一個對象。
垃圾收集,執(zhí)行環(huán)境會負責管理代碼執(zhí)行過程中使用的內(nèi)存。找出那些不再繼續(xù)使用的變量,然后釋放其占用的內(nèi)存。為此,垃圾收集器會按照固定的時間間隔,周期性地執(zhí)行這一操作。局部變量只在函數(shù)執(zhí)行的過程中存在。而在這個過程中,會為局部變量在棧(或堆)內(nèi)存上分配相應的空間,以便存儲它們的值。然后在函數(shù)中使用這些變量,直至函數(shù)執(zhí)行結(jié)束。此時,局部變量就沒有存在的必要了,因此可以釋放它們的內(nèi)存以供將來使用。在這種情況下,很容易判斷變量是否還有存在的必要;但并非所有情況下都這么容易就能得出結(jié)論。垃圾收集器必須跟蹤哪個變量有用哪個變量沒用,對于不再有用的變量打上標記,以備將來收回其占用的內(nèi)存。用于標識無用變量的策略可能會因?qū)崿F(xiàn)而異,但具體到瀏覽器中的實現(xiàn),則通常有兩個策略。
標記清除,當變量進入環(huán)境時,就將這個變量標記為"進入環(huán)境"。當變量離開環(huán)境時,將其標記為"離開環(huán)境"。它會去掉環(huán)境中的變量以及被環(huán)境中的變量引用的變量的標記。而在此之后再被加上標記的變量將被視為準備刪除的變量,原因是環(huán)境中的變量已經(jīng)無法訪問到這些變量了。最后,垃圾收集器完成內(nèi)存清除工作,銷毀那些帶標記的值并回收它們所占用的內(nèi)存空間。
引用計數(shù),跟蹤記錄每個值被引用的次數(shù)。當聲明了一個變量并將一個引用類型值賦給該變量時,則這個值的引用次數(shù)就是 1。如果同一個值又被賦給另一個變量,則該值的引用次數(shù)加 1。相反,如果包含對這個值引用的變量又取得了另外一個值,則這個值的引用次數(shù)減 1。當這個值的引用次數(shù)變成 0 時,則說明沒有辦法再訪問這個值了,因而就可以將其占用的內(nèi)存空間回收回來。這樣,當垃圾收集器下次再運行時,它就會釋放那些引用次數(shù)為零的值所占用的內(nèi)存。
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/97470.html
摘要:不允許直接訪問內(nèi)存中的位置,也就是說不能直接操作對象的內(nèi)存空間。在操作對象時,實際上是在操作對象的引用而不是實際的對象。解除引用的真正作用是讓值脫離執(zhí)行環(huán)境,以便垃圾收集器下次運行時將其回收 1 基本類型和引用類型的值 基本數(shù)據(jù)類型是按值訪問的,因為可以操作保存在變量中的實際的值 基本類型值在內(nèi)存中占據(jù)固定大小的空間,因此被保存在棧內(nèi)存中 引用類型的值是保存在內(nèi)存中的對象。JavaSc...
摘要:具體來說就是當執(zhí)行流進入下列任何一個語句時,作用域鏈就會得到加長語句的塊和語句。這兩個語句都會在作用域鏈的前端添加一個變量對象。對來說,會將指定的對象添加到作用域鏈中。 1. 基本類型和引用類型的值 JavaScript變量可以用來保存兩種類型的值:基本類性值和引用類性值?;绢愋椭翟醋砸韵?種基本數(shù)據(jù)類型:Undefined、Null、Boolean、Number和String。基本...
摘要:具體說就是執(zhí)行流進入下列任何一個語句時,作用域鏈就會得到加長語句的塊。如果局部環(huán)境中存在著同名的標識符,就不會使用位于父環(huán)境中的標識符訪問局部變量要比訪問全局變量更快,因為不用向上搜索作用域鏈。 基本類型和引用類型的值 ECMAscript變量包含 基本類型值和引用類型值 基本類型值值的是基本數(shù)據(jù)類型:Undefined, Null, Boolean, Number, String ...
摘要:對象的核心對象是,它表示瀏覽器的一個實例。而和則表示該容器中頁面視圖區(qū)的大小。在中,與返回相同的值,即視口大小而非瀏覽器窗口大小。第三個參數(shù)是一個逗號分隔的設(shè)置字符串,表示在新窗口中都顯示哪些特性。這應該是用戶打開窗口后的第一個頁面 BOM window對象 BOM的核心對象是window,它表示瀏覽器的一個實例。在瀏覽器中,window對象有雙重角色,它既是通過JavaScript訪...
閱讀 4012·2021-11-18 13:22
閱讀 1829·2021-11-17 09:33
閱讀 2886·2021-09-26 09:46
閱讀 1220·2021-08-21 14:11
閱讀 2896·2019-08-30 15:53
閱讀 2717·2019-08-30 15:52
閱讀 1914·2019-08-30 10:52
閱讀 1528·2019-08-29 15:30