色尼玛亚洲综合影院,亚洲3atv精品一区二区三区,麻豆freexxxx性91精品,欧美在线91

Javascript的閉包

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

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

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

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

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

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

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

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

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

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

更詳細的請查看下面的文章:
http://demo.jb51.NET/js/Javascript_bibao/index.htm

JavaScript技術Javascript的閉包,轉載需保留來源!

鄭重聲明:本文版權歸原作者所有,轉載文章僅為傳播更多信息之目的,如作者信息標記有誤,請第一時間聯(lián)系我們修改或刪除,多謝。

主站蜘蛛池模板: 府谷县| 安阳县| 定边县| 麻栗坡县| 沈阳市| 九龙县| 阿巴嘎旗| 孟州市| 苗栗县| 峨边| 包头市| 永胜县| 福鼎市| 高雄市| 保靖县| 长泰县| 潜山县| 岳阳市| 额敏县| 鄱阳县| 怀化市| 蓬溪县| 贵定县| 洛隆县| 托克逊县| 文安县| 游戏| 六盘水市| 新兴县| 泗洪县| 甘德县| 伊川县| 东光县| 巫山县| 五大连池市| 福安市| 年辖:市辖区| 兴仁县| 边坝县| 元阳县| 军事|