關于Java變量的作用域分析
目錄
1.靜態(tài)作用域與動態(tài)作用域
2.變量的作用域
3.Java 中變量的作用域
4.Java 欺騙作用域
5.Java 執(zhí)行上下文
6.Java 中的作用域鏈
7.Java 中的閉包
8.Java 中的模塊
一
靜態(tài)作用域與動態(tài)作用域
在電腦程序設計中,作用域(scope,或譯作有效范圍)是名字(name)與實體(entity)的綁定(binding)保持有效的那部分計算機程序。不同的編程語言可能有不同的作用域和名字解析。而同一語言內(nèi)也可能存在多種作用域,隨實體的類型變化而不同。作用域類別影響變量的綁定方式,根據(jù)語言使用靜態(tài)作用域還是動態(tài)作用域變量的取值可能會有不同的結(jié)果。
包含標識符的宣告或定義;
包含語句和/或表達式,定義或部分關于可運行的算法;
嵌套嵌套或被嵌套嵌套。
名字空間是一種作用域,使用作用域的封裝性質(zhì)去邏輯上組群起關相的眾識別子于單一識別子之下。因此,作用域可以影響這些內(nèi)容的名字解析。
程序員常會縮進他們的源代碼中的作用域,改善可讀性。
作用域又分為兩種,靜態(tài)作用域和動態(tài)作用域。
靜態(tài)作用域又叫做詞法作用域,采用詞法作用域的變量叫詞法變量。詞法變量有一個在編譯時靜態(tài)確定的作用域。詞法變量的作用域可以是一個函數(shù)或一段代碼,該變量在這段代碼區(qū)域內(nèi)可見(visibility);在這段區(qū)域以外該變量不可見(或無法訪問)。詞法作用域里,取變量的值時,會檢查函數(shù)定義時的文本環(huán)境,捕捉函數(shù)定義時對該變量的綁定。
function f() {
function g() {
}
}
靜態(tài)(詞法)作用域,就是可以無須執(zhí)行程序而只從程序源碼的角度,就可以看出程序是如何工作的。從上面的例子中可以肯定,函數(shù) g 是被函數(shù) f 包圍在內(nèi)部。
大多數(shù)現(xiàn)在程序設計語言都是采用靜態(tài)作用域規(guī)則,如C/C++、C#、Python、Java、Java……
相反,采用動態(tài)作用域的變量叫做動態(tài)變量。只要程序正在執(zhí)行定義了動態(tài)變量的代碼段,那么在這段時間內(nèi),該變量一直存在;代碼段執(zhí)行結(jié)束,該變量便消失。這意味著如果有個函數(shù)f,里面調(diào)用了函數(shù)g,那么在執(zhí)行g的時候,f里的所有局部變量都會被g訪問到。而在靜態(tài)作用域的情況下,g不能訪問f的變量。動態(tài)作用域里,取變量的值時,會由內(nèi)向外逐層檢查函數(shù)的調(diào)用鏈,并打印第一次遇到的那個綁定的值。顯然,最外層的綁定即是全局狀態(tài)下的那個值。
非常好我支持^.^
(0) 0%
不好我反對
(0) 0%