天天看點

詞法作用域與動态作用域的差別

    在計算機程式設計中,變量是名字(name)與實體(entity)的綁定(binding)。一段程式代碼中所用到的名字并不總是有效(或者說:可用的),而限定這個變量名字具有可用性的代碼範圍就是這個名字的作用域。不同的程式設計語言可能有不同的作用域和名字解析設計。同一語言内也可能存在多種作用域,随實體的類型變化而不同。作用域類别影響變量的綁定方式,根據語言使用靜态作用域(詞法作用域)還是動态作用域變量的取值可能會有不同的結果。

   靜态作用域又叫做詞法作用域,采用詞法作用域的變量叫詞法變量。詞法變量有一個在編譯時靜态确定的作用域。詞法變量的作用域可以是一個函數或一段代碼,該變量在這段代碼區域内可見(visibility);在這段區域以外該變量不可見(或無法通路)。詞法作用域裡,取變量的值時,會檢查函數定義時的文本環境,捕捉函數定義時對該變量的綁定。大多數現在程式設計語言都是采用靜态作用域規則,如C/C++、C#、Python、Java、JavaScript……

    采用動态作用域的變量叫做動态變量。隻要程式正在執行定義了動态變量的代碼段,那麼在這段時間内,該變量一直存在;代碼段執行結束,該變量便消失。這意味着如果有個函數f,裡面調用了函數g,那麼在執行g的時候,f裡的所有局部變量都會被g通路到。在靜态作用域的情況下,g不能通路f的變量。動态作用域裡,取變量的值時,會由内向外逐層檢查函數的調用鍊,并列印第一次遇到的那個綁定的值。顯然,最外層的綁定即是全局狀态下的那個值。采用動态作用域的語言有Emacs Lisp、Common Lisp(兼有靜态作用域)、Perl(兼有靜态作用域)。C/C++的宏中用到的名字,也是動态作用域。

具體參見Scope (computer science)

繼續閱讀