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

首頁 > 語言 > JavaScript > 正文

深入理解JavaScript系列(14) 作用域鏈介紹(Scope Chain)

2024-05-06 14:22:06
字體:
來源:轉載
供稿:網友
前言
在第12章關于變量對象的描述中,我們已經知道一個執行上下文 的數據(變量、函數聲明和函數的形參)作為屬性存儲在變量對象中。
同時我們也知道變量對象在每次進入上下文時創建,并填入初始值,值的更新出現在代碼執行階段。
這一章專門討論與執行上下文直接相關的更多細節,這次我們將提及一個議題——作用域鏈。
英文原文:http://dmitrysoshnikov.com/ecmascript/chapter-4-scope-chain/
中文參考:http://www.denisdeng.com/?p=908
本文絕大部分內容來自上述地址,僅做少許修改,感謝作者
定義
如果要簡要的描述并展示其重點,那么作用域鏈大多數與內部函數相關。
我們知道,ECMAScript 允許創建內部函數,我們甚至能從父函數中返回這些函數。
代碼如下:
var x = 10;
function foo() {
var y = 20;
function bar() {
alert(x + y);
}
return bar;
}
foo()(); // 30

這樣,很明顯每個上下文擁有自己的變量對象:對于全局上下文,它是全局對象自身;對于函數,它是活動對象。
作用域鏈正是內部上下文所有變量對象(包括父變量對象)的列表。此鏈用來變量查詢。即在上面的例子中,“bar”上下文的作用域鏈包括AO(bar)、AO(foo)和VO(global)。
但是,讓我們仔細研究這個問題。
讓我們從定義開始,并進深一步的討論示例。
作用域鏈與一個執行上下文相關,變量對象的鏈用于在標識符解析中變量查找。
函數上下文的作用域鏈在函數調用時創建的,包含活動對象和這個函數內部的[[scope]]屬性。下面我們將更詳細的討論一個函數的[[scope]]屬性。
在上下文中示意如下:
代碼如下:
activeExecutionContext = {
VO: {...}, // or AO
this: thisValue,
Scope: [ // Scope chain
// 所有變量對象的列表
// for identifiers lookup
]
};

其scope定義如下:
Scope = AO + [[Scope]]
這種聯合和標識符解析過程,我們將在下面討論,這與函數的生命周期相關。
函數的生命周期
函數的的生命周期分為創建和激活階段(調用時),讓我們詳細研究它。
函數創建
眾所周知,在進入上下文時函數聲明放到變量/活動(VO/AO)對象中。讓我們看看在全局上下文中的變量和函數聲明(這里變量對象是全局對象自身,我們還記得,是吧?)
代碼如下:
var x = 10;
function foo() {
var y = 20;
alert(x + y);
}
foo(); // 30

在函數激活時,我們得到正確的(預期的)結果--30。但是,有一個很重要的特點。
此前,我們僅僅談到有關當前上下文的變量對象。這里,我們看到變量“y”在函數“foo”中定義(意味著它在foo上下文的AO中),但是變量“x”并未在“foo”上下文中定義,相應地,它也不會添加到“foo”的AO中。乍一看,變量“x”相對于函數“foo”根本就不存在;但正如我們在下面看到的——也僅僅是“一瞥”,我們發現,“foo”上下文的活動對象中僅包含一個屬性--“y”。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表

圖片精選

主站蜘蛛池模板: 宜州市| 萨嘎县| 顺平县| 衡阳市| 蒙阴县| 小金县| 泸溪县| 牡丹江市| 南阳市| 石棉县| 阜新| 翁源县| 东安县| 南陵县| 微博| 贡觉县| 油尖旺区| 化州市| 余姚市| 乐都县| 安仁县| 台中县| 临颍县| 隆子县| 高要市| 兴国县| 平武县| 洛南县| 麦盖提县| 肃宁县| 大荔县| 江口县| 宜兴市| 成安县| 昭平县| 师宗县| 花莲县| 通渭县| 疏勒县| 伊金霍洛旗| 赣州市|