国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > JavaScript > 正文

Javascript的閉包

2019-11-21 00:51:27
字體:
來源:轉載
供稿:網友

簡介
Closure
所謂“閉包”,指的是一個擁有許多變量和綁定了這些變量的環境的表達式(通常是一個函數),因而這些變量也是該表達式的一部分。
閉包是 ECMAScript (JavaScript)最強大的特性之一,但用好閉包的前提是必須理解閉包。閉包的創建相對容易,人們甚至會在不經意間創建閉包,但這些無意創建的閉包卻存在潛在的危害,尤其是在比較常見的瀏覽器環境下。如果想要揚長避短地使用閉包這一特性,則必須了解它們的工作機制。而閉包工作機制的實現很大程度上有賴于標識符(或者說對象屬性)解析過程中作用域的角色。

關于閉包,最簡單的描述就是 ECMAScript 允許使用內部函數--即函數定義和函數表達式位于另一個函數的函數體內。而且,這些內部函數可以訪問它們所在的外部函數中聲明的所有局部變量、參數和聲明的其他內部函數。當其中一個這樣的內部函數在包含它們的外部函數之外被調用時,就會形成閉包。也就是說,內部函數會在外部函數返回后被執行。而當這個內部函數執行時,它仍然必需訪問其外部函數的局部變量、參數以及其他內部函數。這些局部變量、參數和函數聲明(最初時)的值是外部函數返回時的值,但也會受到內部函數的影響。

遺憾的是,要適當地理解閉包就必須理解閉包背后運行的機制,以及許多相關的技術細節。雖然本文的前半部分并沒有涉及 ECMA 262 規范指定的某些算法,但仍然有許多無法回避或簡化的內容。對于個別熟悉對象屬性名解析的人來說,可以跳過相關的內容,但是除非你對閉包也非常熟悉,否則最好是不要跳過下面幾節。

對象屬性名解析
ECMAScript 認可兩類對象:原生(Native)對象和宿主(Host)對象,其中宿主對象包含一個被稱為內置對象的原生對象的子類(ECMA 262 3rd Ed Section 4.3)。原生對象屬于語言,而宿主對象由環境提供,比如說可能是文檔對象、DOM 等類似的對象。

原生對象具有松散和動態的命名屬性(對于某些實現的內置對象子類別而言,動態性是受限的--但這不是太大的問題)。對象的命名屬性用于保存值,該值可以是指向另一個對象(Objects)的引用(在這個意義上說,函數也是對象),也可以是一些基本的數據類型,比如:String、Number、Boolean、Null 或 Undefined。其中比較特殊的是 Undefined 類型,因為可以給對象的屬性指定一個 Undefined 類型的值,而不會刪除對象的相應屬性。而且,該屬性只是保存著 undefined 值。

下面簡要介紹一下如何設置和讀取對象的屬性值,并最大程度地體現相應的內部細節。

值的賦予
對象的命名屬性可以通過為該命名屬性賦值來創建,或重新賦值。即,對于:

var objectRef = new Object(); //創建一個普通的 javascript 對象。
可以通過下面語句來創建名為 “testNumber” 的屬性:

objectRef.testNumber = 5;
/* - 或- */
objectRef["testNumber"] = 5;
在賦值之前,對象中沒有“testNumber” 屬性,但在賦值后,則創建一個屬性。之后的任何賦值語句都不需要再創建這個屬性,而只會重新設置它的值:

objectRef.testNumber = 8;
/* - 或- */
objectRef["testNumber"] = 8;
稍后我們會介紹,Javascript 對象都有原型(prototypes)屬性,而這些原型本身也是對象,因而也可以帶有命名的屬性。但是,原型對象命名屬性的作用并不體現在賦值階段。同樣,在將值賦給其命名屬性時,如果對象沒有該屬性則會創建該命名屬性,否則會重設該屬性的值。

更詳細的請查看下面的文章:
http://demo.VeVB.COm/js/javascript_bibao/index.htm

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 乳源| 亚东县| 三河市| 桃源县| 县级市| 泌阳县| 博湖县| 会理县| 罗城| 裕民县| 三门县| 乳山市| 读书| 米林县| 城口县| 寿光市| 贵南县| 昌吉市| 来宾市| 额济纳旗| 德江县| 山阴县| 金阳县| 穆棱市| 秦安县| 阜宁县| 阿克| 通辽市| 呼伦贝尔市| 柘城县| 西和县| 寿宁县| 诏安县| 增城市| 尖扎县| 衢州市| 明水县| 邯郸市| 株洲市| 清水县| 泸水县|