6、 變量的作用域 此前,我們將變量附著在Flash文檔主時間軸的某個單獨幀上,并籍此學(xué)習(xí)了如何創(chuàng)建變量并取回變量的值。當(dāng)某個電影文檔中包含多個幀以及多個電影剪輯時間軸時,變量的創(chuàng)建和值的取回就變得略微復(fù)雜了。
為了清楚地闡釋,我們提出幾個設(shè)想。
1.設(shè)想一 假設(shè)我們在時間軸的第一幀上創(chuàng)建一個變量x,隨后將其值設(shè)置為10: var x; x = 10;
接著,在下一個幀(幀二)中,我們附著下列代碼: trace (x);
當(dāng)我們測試電影時,在Output窗口中會出現(xiàn)什么?我們在幀一中創(chuàng)建變量,而試圖在幀二中取回它的值,我們的變量仍然存在嗎?
答案:是的。
提示:當(dāng)你在某個時間軸上定義了某個變量之后,你可以在該時間軸的任何幀上訪問這個變量。
2.設(shè)想二 假設(shè)我們創(chuàng)建并設(shè)置變量x,不過和設(shè)想一不同的是,我們并不把變量設(shè)置代碼直接放置在第一幀中,取而代之的是將這些代碼放置在幀一中的某個按鈕上。接著,在幀二中,我們加入與設(shè)想一同樣的代碼: trace (x);
設(shè)想二也能正常工作嗎?
答案:是的。因為變量x被附著在按鈕上,而按鈕又附著在主時間軸上,可以推理出變量x間接地附著在主時間軸上;因此,我們可以象設(shè)想一那樣在幀二中訪問該變量。
3.設(shè)想三 假設(shè)我們在主時間軸的第一幀上創(chuàng)建名為secretPassword的變量。當(dāng)電影運行時,為了獲得該電影中某個特定區(qū)域的訪問權(quán),用戶必須輸入正確的密碼。
除了在幀一中聲明變量secretPassword之外,我們還要創(chuàng)建一個函數(shù);該函數(shù)校驗用戶的輸入是否與真正的密碼相吻合。下面是該腳本代碼: var secretPassword; secretPassword = "yppah";
function checkPassword () { if (userPassword == secretPassword) { gotoAndStop ("accessGranted"); } else { gotoAndStop ("accessDenied"); } }
假設(shè)我們在第三十幀處要求用戶輸入他的密碼。為了獲得訪問權(quán),用戶將密碼輸入到一個名為userPassword的輸入文本域(input text field)變量中;然后我們在幀一的腳本中用函數(shù)checkPassword ()對比變量secretPassword和上述輸入文本域變量userPassword是否一致。如果我們的密碼校驗代碼被定義在第一幀上,而變量userPassword直到第三十幀才被定義,那么當(dāng)我們調(diào)用checkPassword ()函數(shù)時,變量userPassword存在嗎?
答案依然是:是的。即使userPassword被定義在函數(shù)checkPassword ()所在幀之后的幀上,它們?nèi)蕴幱谕粋時間軸。
提示:在某個時間軸上聲明的任何變量對于該時間軸上的所有腳本來說都是可用的 —— 只要該時間軸還存在。
4.變量的可訪問性(作用域) 上述提出的三個設(shè)想探索了有關(guān)作用域的問題。一個變量的作用域描述了該變量在何時以及在何處能被電影中的代碼所操作。一個變量的作用域定義了該變量的生存期以及腳本中的其他代碼塊對它的可訪問性。為了確定變量的作用域,我們必須回答兩個問題:(1)變量能存在多長時間?(2)在我們的代碼中,從哪里能夠設(shè)置并取回變量的值?
在傳統(tǒng)的編程語言中,變量通常被分為兩種常規(guī)的作用域類型:全局的和局部的。在整個程序中,從任何地方都可以訪問的變量稱之為全局變量。在整個程序中,只有在有限的一個或幾個部分的內(nèi)部才可以訪問的變量稱之為局部變量。盡管Flash支持傳統(tǒng)的局部變量,但是它并不支持真正的全局變量。讓我們來揭示這是為什么。
5.電影剪輯變量 就象我們在前面的三個設(shè)想中看到的那樣,定義在某個時間軸上的變量對于該時間軸上的所有腳本來說都是可用的 —— 從第一幀到最后一幀 —— 無論該變量被聲明在一個幀中或是一個按鈕上。但是,如果某個電影中有多個時間軸時會發(fā)生什么?是設(shè)想四中描述的那樣嗎?
5.1設(shè)想四 假設(shè)我們有兩個基本的幾何圖形,一個正方形和一個圓形,都被定義為電影剪輯符號。
在正方形電影剪輯符號的第一幀,我們設(shè)置變量x為3: var x; x = 3;
在圓形電影剪輯符號的第一幀,我們設(shè)置變量y為4: var y; y = 4;
我們將這兩個電影剪輯符號的實例放置在電影文檔主時間軸的第一層第一幀上,并將這兩個實例分別命名為square和circle。
第一個問題:如果我們將下列代碼附著在主時間軸的第一幀上(square和circle的所在幀),在Output窗口中會出現(xiàn)什么? trace (x); trace (y);
答案:Output窗口中什么也不會出現(xiàn)(或出現(xiàn)兩個undefined)。變量x和變量y被定義在各自的電影剪輯時間軸中,而非主時間軸中。
提示:附著在某個電影剪輯時間軸上的變量的作用域被限制在該時間軸中。其他時間軸上的腳本(比如本例中主時間軸上的兩個trace ()命令)無法直接訪問該變量。
第二個問題:如果我們將trace (x)和trace (y)這兩個語句放置在square電影剪輯的第一幀上從以取代放置在主電影時間軸的第一幀上,那么在Output窗口中會出現(xiàn)什么?
答案:Output窗口只會出現(xiàn)變量x的值,也就是3,而沒有其他東西出現(xiàn)(或者出現(xiàn)3和一個undefined)。變量x的值能夠被顯示是因為x定義在square電影剪輯的時間軸上,因此能被位于同一時間軸上的trace ()命令所訪問。而變量y的值,也就是4,無法在Output窗口中出現(xiàn),這是因為變量y被定義在circle中,也就是說處于另外一個單獨的時間軸上,因此對于處在square電影剪輯時間軸上的trace ()命令來說它是不可見的。
此前,我說過ActionScript不支持真正的全局變量,而現(xiàn)在,你應(yīng)該可以理解這是為什么了。全局變量是在整個程序中都可以訪問的變量,但是在Flash中,一個附著在單獨時間軸上的變量只能被該時間軸上的腳本直接訪問。因為Flash中的所有變量都定義在各個時間軸上(直接地或間接地),所以沒有哪個變量可以保證被電影中的所有腳本直接訪問,因此,沒有哪個變量能被合理地稱為全局變量。
為避免混淆,我們將附著在時間軸上的變量稱為“時間軸變量”或“電影剪輯變量”。
不過,使用對象類來模擬全局變量是可能的。為了創(chuàng)建在所有時間軸上都可用的變量,使用以下語句: Object.prototype.myGlobalVariables = myValue;
例如: Object.prototype.msg = "Hello, world!";
這項技術(shù)以及其工作原理我們將在以后的章節(jié)中討論。
出處:藍色理想
責(zé)任編輯:無意
上一頁 變量(5)- 變量值的類型 下一頁 變量(7)- 在不同的時間軸上訪問變量
◎進入論壇Flash專欄版塊參加討論
|