9.局部變量 電影剪輯限制了電影剪輯變量的作用域,變量被定義在電影剪輯中,而且只要這些電影剪輯存在(在工作區(qū)中),那么這些變量就持續(xù)。
有時(shí)候,變量生存的時(shí)間比我們需要的還長(zhǎng)。在我們只是需要一個(gè)臨時(shí)變量的情況下,ActionScript提供了只有局部作用域的變量(也就是局部變量),局部變量生存的時(shí)間比常規(guī)的電影剪輯變量短了許多。
局部變量被用于函數(shù)中以及早期Flash 4風(fēng)格的子程序中。如果你以前沒有使用過函數(shù)或子程序,你可以跳過這一部分并在未來章節(jié)中學(xué)習(xí)了函數(shù)之后再重新光臨這里。
函數(shù)經(jīng)常使用一些在該函數(shù)外并不被需要的變量。例如,假設(shè)我們有一個(gè)函數(shù),該函數(shù)顯示某個(gè)被指定的數(shù)組中的所有元素: function displayElements (theArray) { var counter = 0; while (counter < theArray.length) { trace ("Element " + counter + ": " + theArray[counter]); counter ++; } }
變量counter對(duì)于顯示該數(shù)組來說是必要的,但是除此之外,它再也沒有存在的價(jià)值了。我們也可以將它定義在時(shí)間軸上,不過至少有兩個(gè)原因能夠說明那是很討人嫌的行為:(1)如果counter持續(xù),在電影播放的余下時(shí)間內(nèi)它將占據(jù)著一定的存儲(chǔ)器空間(雖然減價(jià),但是內(nèi)存條對(duì)我來說還是很貴),而且(2)如果counter在我們的函數(shù)外可以被訪問,那么它可能會(huì)與其他的被命名為counter的變量發(fā)生沖突。因此,我們非常愿意看到在函數(shù)displayElements ()結(jié)束之后,counter立即死去。
為了促使counter在該函數(shù)的結(jié)尾處被自動(dòng)刪除,我們將它定義為局部變量。局部變量和電影剪輯變量不同,當(dāng)定義它們的函數(shù)結(jié)束時(shí),解釋器會(huì)自動(dòng)地將它們從存儲(chǔ)器中移除(即取消分配,deallocated)。
為了將某個(gè)變量指定為局部的,從你的函數(shù)內(nèi)部用var關(guān)鍵字來聲明它,如同在前述displayElements ()函數(shù)的例子中那樣。
提請(qǐng)注意,當(dāng)位于某個(gè)函數(shù)的外部時(shí),var語(yǔ)句創(chuàng)建一個(gè)常規(guī)的時(shí)間軸變量,而非局部變量。var語(yǔ)句所在的位置是產(chǎn)生這些區(qū)別的根源。
函數(shù)中的變量并非都是局部的。在某個(gè)函數(shù)的內(nèi)部,通過忽略var關(guān)鍵字,我們可以創(chuàng)建并改變某個(gè)電影剪輯變量。即,如果我們不使用var關(guān)鍵字,而代之以僅僅為某個(gè)變量賦值,在某些情況下Flash認(rèn)為該變量是非局部變量。考慮下列函數(shù)內(nèi)部的變量賦值語(yǔ)句: function setHeight () { height = 10; }
語(yǔ)句height = 10;的作用取決于height是否是一個(gè)局部變量或者是一個(gè)時(shí)間軸變量。如果此前height被聲明為局部變量,語(yǔ)句height = 10;則僅是簡(jiǎn)單地改變?cè)摼植孔兞康闹怠H绻淮嬖诿麨閔eight的局部變量,照此例中的樣子,解釋器創(chuàng)建一個(gè)名為height的電影剪輯變量(非局部變量),并將其值設(shè)置為10。作為非局部變量,即使是在該函數(shù)結(jié)束之后,height仍然持續(xù)。再次提醒注意:我多次使用時(shí)間軸變量和電影剪輯變量這兩個(gè)術(shù)語(yǔ),它們是同義詞,我此前提到過。
下例示范局部和非局部變量的使用: var x = 5; // new nonlocal variable, x, is now 5 function variableDemo () { x = 10; // nonlocal variable, x, is now 10 y = 20; // new nonlocal variable, y, is now 20 var z = 30; // new local variable, z, is now 30 trace (x + "," + y + "," + z); // send variable values to Output window } variableDemo (); // call our function. displays: 10,20,30 trace (x); // display: 10 (reassignment in our function was permanent) trace (y); // display: 20 (nonlocal variable, y, still exists) trace (z); // display nothing or an "undefined" (local variable, z, has expired)
請(qǐng)注意,某個(gè)局部變量和某個(gè)非局部變量在同一腳本中共享同一個(gè)名字是可能的,但是它們有不同的作用域。不過,我必須得說這非常容易造成混亂并且是極其惡劣的編程行為。下面是這樣的例子: var myColor = "blue"; function hexRed () { var myColor = "#FF0000"; return myColor; } trace (hexRed ()); // displays: #FF0000 (the local variable myColor) trace (myColor); // displays: blue (setting the local variable myColor to #FF0000 did not affect the nonlocal version)
上述這些就是有關(guān)ActionSctipt中變量的理論知識(shí),如果有不詳盡或錯(cuò)誤的地方,請(qǐng)指明。 我愿意聆聽并感激你的有價(jià)值的觀點(diǎn)。
出處:藍(lán)色理想
責(zé)任編輯:無意
上一頁(yè) 變量(8)- 電影剪輯變量的生存期 下一頁(yè) 有關(guān)變量的一些實(shí)例
◎進(jìn)入論壇Flash專欄版塊參加討論
|