外部作用域

外部作用域

在程式設計中,作用域(scope)是名字(name)與實體(entity)的綁定(binding)保持有效的那部分電腦程式。不同的程式語言可能有不同的作用域和名字解析。而同一語言內也可能存在多種作用域,隨實體的類型變化而不同。外部作用域是相對函式內部作用域或當前作用域而言的,一般是通過閉包實現對外部作用域中的變數引用。

基本介紹

  • 中文名:外部作用域
  • 外文名:External scope
  • 學科:計算機科學
  • 定義:被其他作用域引用
  • 有關術語:閉包、變數
  • 領域:程式設計
簡介,變數,局部變數,全局變數,閉包,概述,用途,

簡介

作用域是一個變數和函式的作用範圍,例如javascript中函式內聲明的所有變數在函式體內始終是可見的,在javascript中有全局作用域和局部作用域。外部作用域是相對當前作用域而言的,外部作用域一般指的是外部函式中變數作用域。因為在執行一個函式時可能需要引用其他函式中的變數,一般都是通過閉包來實現調用,原因主要是隱藏和保護外部作用域執行上下文。

變數

程式設計中,變數(Variable,scalar)是指一個包含部分已知或未知數值或資訊(即一個)之儲存位址,以及相對應之符號名稱(識別字)。通常使用變數名稱參照儲存值;將名稱和內容分開能讓被使用的名稱獨立於所表示的精確訊息之外。在定義了一個變數以後,並不是在 程式的任何地方都可以使用這個變數。只有在變數的作用域內才能使用這個 變數。在C語言中如果按作用域分,變數分為局部變數和全局變數。

局部變數

在一個函式內部定義的變數被稱作局部變數,這種變數的作用域是在本 函式範圍內。通俗一點說,局部變數只能在定義它的函式內部使用,而不能 在其它函式內使用這個變數。
說明:
1、main函式也是一個函式,它內部定義的變數也只能在main函式內部使用, 而不能在其它函式內部使用main函式內部定義的變數。
2、不同的函式中可以使用相同的變數名,但它們是不同的變數。記得 數在執行時,系統要給它分配一塊單獨的記憶體嗎?所以雖然變數是一樣的, 但系統看到它們定義在不同的函式中,就認為它們是不同的變數。這樣做有 個好處,可以在函式內部,根據需要設定任何的變數名。如果不是這樣,那 么在一個函式內定義了一個變數名後,在其它函式內就不能再使用相同的變 量名了。
3、形參也屬於局部變數,作用範圍在定義它的函式內。所以在定義形參 和函式體內的變數時是肯定不能重名的了。
4、在複合語句內部也可以定義變數,這些變數的作用域只在本複合語句 中。只在需要的時候再定義變數,這樣做可以提高記憶體的利用率。

全局變數

在函式外部定義的變數稱作外部變數,外部變數屬於全局變數。全局變 量的作用域是從定義變數的位置開始到本源檔案結束。這樣全局變數可以讓 很多函式都使用它。
說明:
1、在一個函式內部,即可以使用本函式定義的局部變數,也可以使用 在此函式前定義的全局變數。在上面的例子中,main函式和f2函式中可以使 用全局變數a,b,x,y,而在f1函式內只能使用全局變數x,y。
2、全局變數的作用是使得函式間多了一種傳遞信息的方式。如果在一 個程式中各個函式都要對同一個信息進行處理,就可以將這個信息定義成全 局變數。另外,採用這種方式,可以從某個函式內部得到多個計算值
3、全局變數的作用範圍是從定義位置起直到程式結束處。如果想在定義 全局變數的前面直接使用全局變數是不可能的。如果就是想用,就將全局變 量的定義往前寫一寫。另外還有一種方法,不用改變全局變數的定義位置, 就是在要使用全局變數的函式內使用extern關鍵字對要使用的全局變數說明一 下,告訴系統,我要使用的這個變數可是全局變數啊!
4、如果在一個函式內部,一個局部變數和一個全局變數重名,那么是局 部變數起作用。而外部變數不起作用。

閉包

概述

在計算機科學中,閉包(英語:Closure),又稱詞法閉包(Lexical Closure)或函式閉包(function closures),是引用了自由變數的函式。這個被引用的自由變數將和這個函式一同存在,即使已經離開了創造它的環境也不例外。所以,有另一種說法認為閉包是由函式和與其相關的引用環境組合而成的實體。閉包在運行時可以有多個實例,不同的引用環境和相同的函式組合可以產生不同的實例。
彼得·蘭丁 在1964年將術語 閉包 定義為一種包含 環境成分 和 控制成分的實體,用於在他的SECD 機器上對表達式求值。 Joel Moses 認為是 Landin 發明了 閉包 這一術語,用來指代某些其開放綁定(自由變數)已經由其語法環境完成閉合(或者綁定)的 lambda 表達式,從而形成了 閉合的表達式,或稱閉包。這一用法後來於 1975 年被 Sussman 和 Steele 在定義 Scheme 語言的時候予以採納。並廣為流傳。

用途

因為閉包只有在被調用時才執行操作(暫且不論用於生成這個閉包對象本身的開銷,比如 C++ 中按值捕獲意味著執行複製構造函式),即“惰性求值”,所以它可以被用來定義控制結構。例如:在Smalltalk語言中,所有的控制結構,包括分歧條件(if/then/else)和循環(while和for),都是通過閉包實現的。用戶也可以使用閉包定義自己的控制結構。
多個函式可以使用一個相同的環境,這使得它們可以通過改變那個環境相互交流。比如在Scheme中:
(define foo #f)
(define bar #f)
(let ((secret-message "none"))
(set! foo (lambda (msg) (set! secret-message msg)))
(set! bar (lambda () secret-message)))
(display (bar)) ; prints "none"
(newline)
(foo "meet me by the docks at midnight")
(display (bar)) ; prints "meet me by the docks at midnight"
閉包可以用來實現對象系統。

相關詞條

熱門詞條

聯絡我們