下載本文檔
版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、變量對(duì)象(Variable Object)介紹JavaScript 編程的時(shí)候總避免不了函數(shù)和變量,以成功構(gòu)建的系統(tǒng),但是解釋器是如何并且在什么地方去查找這些函數(shù)和變量呢?么?這些對(duì)象的時(shí)候究竟發(fā)生了什俄文地址: HYPERLINK http:/d/ http:/d-object/ecmascript/ru-chapter-2-variable英文地址: HYPERLINK http:/d/ http:/d ject/ecmascript/chapter-2-variable-ob大多數(shù) ECMAScript 程序員應(yīng)該都知道變量與執(zhí)行上下文有密切關(guān)系:var a = 10; / 全局上下文中
2、的變量(function var b =)();() 20; / function 上下文中的局部變量alert(a);alert(b);/ 10/ 全局變量 b 沒(méi)有并且,很多程序員也都知道,當(dāng)前 ECMAScript 規(guī)范獨(dú)立作用域只能通過(guò)“函數(shù)(function)”代碼類型的執(zhí)行上下文創(chuàng)建。也就是說(shuō),相對(duì)于C/C+來(lái)說(shuō),ECMAScript 里的 for循環(huán)并不能創(chuàng)建一個(gè)局部的上下文。for (var k in a: 1, b: 2) alert(k);alert(k); / 盡管循環(huán)已經(jīng)結(jié)束但變量k 依然在當(dāng)前作用域來(lái)看看一下,數(shù)據(jù)的時(shí)候到底都發(fā)現(xiàn)了什么細(xì)節(jié)。數(shù)據(jù)如果變量與執(zhí)行上下文相
3、關(guān),那變量自己應(yīng)該知道它的數(shù)據(jù)問(wèn)。這種機(jī)制稱為變量對(duì)象(variable object)。在哪里,并且知道如何訪變量對(duì)象(縮寫(xiě)為 VO)是一個(gè)與執(zhí)行上下文相關(guān)的特殊對(duì)象,它著在上下文中的以下內(nèi)容:變量 (var, 變量);函數(shù)(FunctionDeclaration, 縮寫(xiě)為 FD);函數(shù)的形參舉例來(lái)說(shuō),可以用普通的ECMAScript 對(duì)象來(lái)表示一個(gè)變量對(duì)象:VO = ;就像所說(shuō)的, VO 就是執(zhí)行上下文的屬性(property):activeExecutionContext = VO: / 上下文數(shù)據(jù)(var, FD, function arguments);只有全局上下文的變量對(duì)象允許通
4、過(guò) VO 的屬性名稱來(lái)間接(因?yàn)樵谌稚舷挛睦?,全局?duì)象自身就是變量對(duì)象,稍后會(huì)詳細(xì)介紹),在其它上下文中是不能直接VO 對(duì)象 的,因?yàn)樗皇菣C(jī)制的一個(gè)實(shí)現(xiàn)。當(dāng)一個(gè)變量或一個(gè)函數(shù)的時(shí)候,和創(chuàng)建 VO 新屬性的時(shí)候一樣沒(méi)有別的區(qū)別(即:有名稱以及對(duì)應(yīng)的值)。例如:var a = 10;function test(x) var b = 20;test(30);對(duì)應(yīng)的變量對(duì)象是:/ 全局上下文的變量對(duì)象VO(globalContext) = a: 10,test: ;/ test 函數(shù)上下文的變量對(duì)象VO(test functionContext) = x: 30,b: 20;在具體實(shí)現(xiàn)層面(以及規(guī)
5、范中)變量對(duì)象只是一個(gè)抽象概念。(從本質(zhì)上說(shuō),在具體執(zhí)行上下文中,VO 名稱是不一樣的,并且初始結(jié)構(gòu)也不一樣。不同執(zhí)行上下文中的變量對(duì)象對(duì)于所有類型的執(zhí)行上下文來(lái)說(shuō),變量對(duì)象的一些操作(如變量初始化)和行為都是共通 的。從這個(gè)角度來(lái)看,把變量對(duì)象作為抽象的基本事物來(lái)理解更為容易。同樣在函數(shù)上下文中也定義和變量對(duì)象相關(guān)的額外內(nèi)容。抽象變量對(duì)象 VO (變量初始化過(guò)程的一般行為) 全局上下文變量對(duì)象 GlobalContextVO(VO = this = global) 函數(shù)上下文變量對(duì)象 FunctionContextVO(VO = AO, 并且添加了和)來(lái)詳細(xì)看一下:全局上下文中的變量對(duì)象首先
6、,要給全局對(duì)象一個(gè)明確的定義:全局對(duì)象(Global object) 是在進(jìn)入任何執(zhí)行上下文之前就已經(jīng)創(chuàng)建了的對(duì)象;這個(gè)對(duì)象只存在一份,它的屬性在程序中任何地方都可以,全局對(duì)象的生命周期終止于程序退出那一刻。全局對(duì)象初始創(chuàng)建階段將 Math、String、Date、parse作為自身屬性,等屬性初始化,同樣也可以有額外創(chuàng)建的其它對(duì)象作為屬性(其可以指向到全局對(duì)象自身)。例如,在 D OM 中,全局對(duì)象的 window 屬性就可以全局對(duì)象自身(當(dāng)然,并不是所有的具體實(shí)現(xiàn)都是這樣):global = Math: ,String: .window: global /自身;當(dāng)全局對(duì)象的屬性時(shí)通常會(huì)忽略
7、掉前綴,這是因?yàn)槿謱?duì)象是不能通過(guò)名稱直接 的。不過(guò)依然可以通過(guò)全局上下文的 this 來(lái)全局對(duì)象,同樣也可以遞歸自身。例如,DOM 中的 window。綜上所述,代碼可以簡(jiǎn)寫(xiě)為:String(10); / 就是 global.String(10);例如:function foo(x, y, z) /的函數(shù)參數(shù)數(shù)量 arguments (x, y, z) alert(foo.length); / 3callee 指向當(dāng)前函數(shù)的length 真正傳遞的參數(shù)個(gè)數(shù)properties-indexes (字符串類型的整數(shù)) 屬性的值就是函數(shù)的參數(shù)值(按參數(shù)列表從左到右排列)。 properties-i
8、ndexes元素的個(gè)數(shù)等于 arguments.length. pro perties-indexes 的值和實(shí)際傳遞進(jìn)來(lái)的參數(shù)之間是共享的。/ 帶有前綴window.a = 10; / = global.window.a = 10 = global.a = 10; this.b = 20; / global.b = 20;因此,回到全局上下文中的變量對(duì)象在這里,變量對(duì)象就是全局對(duì)象自己:VO(globalContext) = global;非常有必要要理解上述結(jié)論,基于這個(gè)原理,在全局上下文中的對(duì)應(yīng),才可以間接通過(guò)全局對(duì)象的屬性來(lái)它(例如,事先不知道變量名稱)。var a = new Str
9、ing(test);alert(a); / 直接,在 VO(globalContext)里找到:testalert(windowa); / 間接通過(guò) global:global = VO(globalConte xt): testalert(a = this.a); / truevar aKey = a;alert(windowaKey); / 間接通過(guò)動(dòng)態(tài)屬性名稱:test函數(shù)上下文中的變量對(duì)象在函數(shù)執(zhí)行上下文中,VO 是不能直接的,此時(shí)由活動(dòng)對(duì)象(activation object,縮寫(xiě)為 AO)扮演 VO 的角色。VO(functionContext) = AO;活動(dòng)對(duì)象是在進(jìn)入函數(shù)上下
10、文時(shí)刻被創(chuàng)建的,它通過(guò)函數(shù)的 arguments 屬性初始化。argu ments 屬性的值是Arguments 對(duì)象:AO = arguments: ;Arguments 對(duì)象是活動(dòng)對(duì)象的一個(gè)屬性,它包括如下屬性:/ 真正傳進(jìn)來(lái)的參數(shù)個(gè)數(shù)(only x, y) alert(arguments.length); / 2/ 參數(shù)的 callee 是函數(shù)自身alert(arguments.callee = foo); / true/ 參數(shù)共享alert(x = arguments0); / truealert(x); /10arguments0 alert(x); /= 20;20 x = 30;
11、alert(arguments0); / 30/ 不過(guò),沒(méi)有傳進(jìn)來(lái)的參數(shù)z,和參數(shù)的第 3 個(gè)索引值是不共享的z = 40;alert(arguments2); / undefinedarguments2 = 50;alert(z); / 40foo(10, 20);Chrome 瀏覽器里有一個(gè) bug 即使沒(méi)有傳遞這個(gè)例子的代碼,在當(dāng)前版本的參數(shù) z,z 和 arguments2仍然是共享的。處理上下文代碼的 2 個(gè)階段現(xiàn)在終于到了本文的點(diǎn)了。執(zhí)行上下文的代碼被分成兩個(gè)基本的階段來(lái)處理:變量對(duì)象的修改變化與這兩個(gè)階段緊密相關(guān)。注:這 2 個(gè)階段的處理是一般行為,和上下文的類型無(wú)關(guān)(也就是說(shuō),
12、在全局上下文和函數(shù)上下文中的表現(xiàn)是一樣的)。進(jìn)入執(zhí)行上下文執(zhí)行代碼進(jìn)入執(zhí)行上下文當(dāng)進(jìn)入執(zhí)行上下文(代碼執(zhí)行之前)時(shí),VO 里已經(jīng)包含了下列屬性(前面已經(jīng)說(shuō)了):函數(shù)的所有形參(如果是在函數(shù)執(zhí)行上下文中)由名稱和對(duì)應(yīng)值組成的一個(gè)變量對(duì)象的屬性被創(chuàng)建;沒(méi)有傳遞對(duì)應(yīng)參數(shù)的話,那么由名稱和 undefined 值組成的一種變量對(duì)象的屬性也將被創(chuàng)建。所有函數(shù)(FunctionDeclaration, FD)由名稱和對(duì)應(yīng)值(函數(shù)對(duì)象(function-object))組成一個(gè)變量對(duì)象的屬性被創(chuàng)建;如果變量對(duì)象已經(jīng)存在相同名稱的屬性,則完全替換這個(gè)屬性。所有變量(var, VariableDeclarati
13、on)由名稱和對(duì)應(yīng)值(undefined)組成一個(gè)變量對(duì)象的屬性被創(chuàng)建;如果變量名稱跟已經(jīng)的形式參數(shù)或函數(shù)相同,則變量不會(huì)干擾已經(jīng)存在的這類屬性。讓看一個(gè)例子:function test(a, b) var c = 10; function d() var e = function _e() ; (function x() );test(10); / call當(dāng)進(jìn)入帶有參數(shù) 10 的 test 函數(shù)上下文時(shí),AO 表現(xiàn)為如下:AO(test) = a: 10,b: undefined, c: undefined,d: e: undefined;注意,AO 里并不包含函數(shù)“x”。這是因?yàn)椤皒”
14、是一個(gè)函數(shù)表達(dá)式(FunctionExpres, 縮寫(xiě)為 FE) 而不是函數(shù),函數(shù)表達(dá)式不會(huì)影響 VO。 不管怎樣,函數(shù)“_e” 同樣也是函數(shù)表達(dá)式,但是就像下面將看到的那樣,因?yàn)樗峙浣o了變量 “e”,所以它可以通過(guò)名稱“e”來(lái)。 函數(shù)FunctionDeclaration 與函數(shù)表達(dá)式 FunctionExpres 的不同,將在第 15 章 Functions 進(jìn)行詳細(xì)的探討,也可以參考本系列第 2 章命名函數(shù)表達(dá)式來(lái)了解。這之后,將進(jìn)入處理上下文代碼的第二個(gè)階段 執(zhí)行代碼。代碼執(zhí)行這個(gè)周期內(nèi),AO/VO 已經(jīng)擁有了屬性(不過(guò),并不是所有的屬性都有值,大部分屬性的值還是系統(tǒng)默認(rèn)的初始值 u
15、ndefined )。還是前面那個(gè)例子, AO/VO 在代碼解釋期間被:AOc = 10;AOe = ;再次注意,因?yàn)?FunctionExpres內(nèi)存中。而 FunctionExpres“_e”保存到了已的變量“e”上,所以它仍然存在于“x”卻不存在于 AO/VO 中,也就是說(shuō)如果想嘗試調(diào)用“x”函數(shù),不管在函數(shù)定義之前還是之后,都會(huì)出現(xiàn)一個(gè)錯(cuò)誤“x存的函數(shù)表達(dá)式只有在它自己的定義或遞歸中才能被調(diào)用。isnot defined”,未保另一個(gè)經(jīng)典例子:alert(x); /functionvar x = 10; alert(x); /10 x = 20;function x();alert(x
16、); /20為什么第一個(gè) alert “x” 的返回值是 function,而且它還是在“x”的“x” 的?之前為什么不是 10 或 20 呢?因?yàn)?,根?jù)規(guī)范函數(shù)是在當(dāng)進(jìn)入上下文時(shí)填入的; 同意周“x”,那么正如期,在進(jìn)入上下文的時(shí)候還有一個(gè)變量在上一個(gè)階段所說(shuō),變量聲順序上跟在函數(shù)和形式參數(shù)之后,而且在這個(gè)進(jìn)入上下文階段,變量不會(huì)干擾 VO 中已經(jīng)存在的同名函數(shù)結(jié)構(gòu)如下:,因此,在進(jìn)入上下文時(shí),VO 的或形式參數(shù)VO = ;VOx = /找到 var x = 10;如果 function x沒(méi)有已經(jīng)的話這時(shí)候x的值應(yīng)該是 undefined但是這個(gè) case 里變量沒(méi)有影響同名的 funct
17、ion 的值VOx = 緊接著,在執(zhí)行代碼階段,VO 做如下修改:VOx = 10;VOx = 20;可以在第二、三個(gè) alert 看到這個(gè)效果。在下面的例子里可以再次看到,變量是在進(jìn)入上下文階段放入 VO 中的。(因?yàn)椋m然else 部分代碼不會(huì)執(zhí)行,但是不管怎樣,變量“b”仍然存在于 VO 中。)if (true) var a = 1; else var b = 2;alert(a); / 1alert(b); / undefined,不是 b 沒(méi)有,而是b 的值是 undefined關(guān)于變量通常,各類文章和 JavaScript 相關(guān)的書(shū)籍都聲稱:“不管是使用var 關(guān)鍵字(在全局上下文
18、)還是不使用var 關(guān)鍵字(在任何地方),都可以一個(gè)變量”。請(qǐng)記住,這是錯(cuò)誤的概念:任何時(shí)候,變量只能通過(guò)使用var 關(guān)鍵字才能。上面的賦值語(yǔ)句:a = 10;這僅僅是給全局對(duì)象創(chuàng)建了一個(gè)新屬性(但它不是變量)?!安皇亲兞俊辈⒉皇钦f(shuō)它不能被改變,而是指它不符合ECMAScript 規(guī)范中的變量概念,所以它“不是變量”(它之所以能成為全局對(duì)象的屬性,完全是因?yàn)?VO(globalContext) = global,大家還記得這個(gè)吧?)。讓通過(guò)下面的實(shí)例看看具體的區(qū)別吧:alert(a); / undefined alert(b); / b 沒(méi)有b = 10;var a = 20;所有根源仍然是
19、VO 和進(jìn)入上下文階段和代碼執(zhí)行階段:進(jìn)入上下文階段:VO = a: undefined;可以看到,因?yàn)椤癰”不是一個(gè)變量,所以在這個(gè)階段根本就沒(méi)有“b”,“b”將只在代碼執(zhí)行階段才會(huì)出現(xiàn)(但是在這個(gè)例子里,還沒(méi)有到那就已經(jīng)出錯(cuò)了)。讓改變一下例子代碼:alert(a); / undefined, 這個(gè)大家都知道,b = 10;alert(b); / 10, 代碼執(zhí)行階段創(chuàng)建var a = 20;alert(a); / 20, 代碼執(zhí)行階段修改關(guān)于變量,還有一個(gè)重要的知識(shí)點(diǎn)。變量相對(duì)于簡(jiǎn)單屬性來(lái)說(shuō),變量有一個(gè)特性(attribut e):DontDelete,這個(gè)特性的含義就是不能用 dele
20、te 操作符直接刪除變量屬性。a = 10;alert(window.a); / 10 alert(delete a); / true alert(window.a); / undefinedvar b = 20; alert(window.b); / 20alert(delete b); / false alert(window.b); / still 20但是這個(gè)規(guī)則在有個(gè)上下文里不起走樣,那就是 eval 上下文,變量沒(méi)有DontDelete特性。eval(var a = 10;); alert(window.a); / 10alert(delete a); / true alert(window.a); / undefined使用一些調(diào)試工具(例如:Firebug)的控制臺(tái)測(cè)試該實(shí)例時(shí),請(qǐng)注意,F(xiàn)irebug 同樣是使用 eval 來(lái)執(zhí)行控制臺(tái)里你的代碼。因此,變量屬性同樣沒(méi)有DontDelete特性,可以被刪 除。特殊實(shí)現(xiàn): parent 屬性前面已經(jīng)提到過(guò)
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 護(hù)理研究生教學(xué)實(shí)踐總結(jié)(3篇)
- 專題04 語(yǔ)言表達(dá)+綜合性學(xué)習(xí)(第2期)
- 專題07:環(huán)境描寫(xiě)作用(講解)
- 中班幼兒語(yǔ)言教學(xué)活動(dòng)策劃方案五篇
- 幼兒園組織旅游活動(dòng)策劃方案五篇
- ktv房間租賃合同
- 幼兒園找春天主題活動(dòng)策劃方案五篇
- 10kV配電站房場(chǎng)地選擇與環(huán)境評(píng)估
- 個(gè)人擔(dān)保借款合同
- 政府采購(gòu)合同協(xié)議書(shū)
- 2025-2030年中國(guó)電動(dòng)高爾夫球車市場(chǎng)運(yùn)行狀況及未來(lái)發(fā)展趨勢(shì)分析報(bào)告
- 河南省濮陽(yáng)市2024-2025學(xué)年高一上學(xué)期1月期末考試語(yǔ)文試題(含答案)
- 長(zhǎng)沙市2025屆中考生物押題試卷含解析
- 2024年08月北京中信銀行北京分行社會(huì)招考(826)筆試歷年參考題庫(kù)附帶答案詳解
- 蘇教版二年級(jí)數(shù)學(xué)下冊(cè)全冊(cè)教學(xué)設(shè)計(jì)
- 職業(yè)技術(shù)學(xué)院教學(xué)質(zhì)量監(jiān)控與評(píng)估處2025年教學(xué)質(zhì)量監(jiān)控督導(dǎo)工作計(jì)劃
- 金字塔原理與結(jié)構(gòu)化思維考核試題及答案
- 廣東省梅州市2023-2024學(xué)年七年級(jí)上學(xué)期期末數(shù)學(xué)試題
- 基礎(chǔ)護(hù)理學(xué)導(dǎo)尿操作
- 標(biāo)牌加工風(fēng)險(xiǎn)防范方案
- 2015-2024北京中考真題英語(yǔ)匯編:閱讀單選CD篇
評(píng)論
0/150
提交評(píng)論