2011-12-12 30 views
-4

靜態作用域和動態作用域之間是否有任何相似之處?我幾乎找不到任何東西。靜態和動態作用域之間的相似

+0

順便說一句,「靜態」範圍也被稱爲「詞法」範圍 - 即它在編譯時(基於源代碼)而不是運行時(基於調用者)範圍內。 – Mehrdad

回答

0

靜態範圍界定或詞法範圍意味着聲明變量的位置可以通過查看周圍範圍來確定。動態範圍意味着聲明變量的位置是通過查找調用棧來動態確定的。例如:

var x = 2; 
function foo(){ 
    return x; 
} 
function bar(...){ 
    var x = 3; 
    print(foo()); 
} 
bar(); 

使用靜態或詞法作用域將打印2. x內部foo來自周圍範圍。通過動態範圍設置,將打印3,因爲x的值是通過在調用堆棧中查找bar函數調用來確定的。那時定義了一個x,所以使用x = 3的值。

早期的Lisp對所有變量都使用動態作用域,但那已被廣泛認爲是一個錯誤。後來的Lisp和大多數其他語言都使用詞法範圍。一些語言,如Common Lisp,確實提供了特殊的動態範圍變量。像C#和Java這樣的主流語言也具有有限的動態範圍界定形式:異常處理程序通常是動態範圍的;如果引發異常,則調用的異常處理程序將在堆棧中動態查找,而不是由代碼結構靜態確定。例如:

try { 
    function foo(){ 
    throw new Exception(); 
    } 
} catch (Exception e){ print "A"; } 

try { 
    foo(); 
} catch (Exception e){ print "B"; } 

此代碼將打印「B」,而不是「A」。請注意,您需要使用lambda表達式在例如C#。

+0

謝謝你的答案,但它仍然沒有證明什麼兩個commnon。 – user1092828

+0

好吧,這就像問if語句和for循環有什麼共同點。它並沒有真正的答案(「它們都有花括號」)。由於這可能是一個家庭作業問題,如果你解釋我在這裏解釋的內容,我認爲你會得到一個好成績。或者你可以沿着「靜態和動態範圍確定是確定變量值來自哪裏的方式」的方式說一些話,但這是乞求的問題。 – Jules

0

就我所知,兩者之間並無相似之處。它們之間只有不同之處,就像@Jules上面解釋的那樣 在靜態作用域中,名稱是指其最接近的綁定,在程序文本中從內部到外部作用域 在動態作用域中,名稱是指在運行時最接近的綁定。