摘要:函數(shù)的作用域會(huì)在函數(shù)執(zhí)行時(shí)用到,函數(shù)每次執(zhí)行都會(huì)創(chuàng)建一個(gè)執(zhí)行環(huán)境的內(nèi)部對(duì)象,每個(gè)執(zhí)行環(huán)境都有自己的作用域鏈。假設(shè)執(zhí)行,其對(duì)應(yīng)的作用域鏈如下函數(shù)執(zhí)行過(guò)程中,變量的查找時(shí)從作用域頭部開始查找,如果找到就是使用改變量的值。
每一個(gè)函數(shù)存在一個(gè)[[Scope]]內(nèi)部屬性,包含了一個(gè)函數(shù)被創(chuàng)建得作用域中對(duì)象得集合,這個(gè)集合為函數(shù)得作用域鏈。例如下面的全局函數(shù):
fucntion add(num1, num2){ var sum = num1 + num2; return sum; }
當(dāng)函數(shù)add被創(chuàng)建時(shí),它的作用域鏈中便插入了一個(gè)對(duì)象變量,里面包含所有在全局范圍內(nèi)定義的變量。
函數(shù)add的作用域會(huì)在函數(shù)執(zhí)行時(shí)用到,函數(shù)每次執(zhí)行都會(huì)創(chuàng)建一個(gè)執(zhí)行環(huán)境的內(nèi)部對(duì)象,每個(gè)執(zhí)行環(huán)境都有自己的作用域鏈。函數(shù)運(yùn)行時(shí),一個(gè)被稱為活動(dòng)對(duì)象的新對(duì)象就為執(zhí)行環(huán)境創(chuàng)建好了,里面包含了函數(shù)的所有局部變量,命名參數(shù),參數(shù)集合以及this。假設(shè)執(zhí)行var total = add(5,10),其對(duì)應(yīng)的作用域鏈如下:
函數(shù)執(zhí)行過(guò)程中,變量的查找時(shí)從作用域頭部開始查找,如果找到就是使用改變量的值。如果找不到就繼續(xù)從作用域下一個(gè)對(duì)象查找,直到找到改變量。如過(guò)匹配不到,則為undefined。當(dāng)頻繁使用全局變量時(shí),可以先使用一個(gè)局部變量保存起來(lái),之后直接訪問(wèn)局部變量可以減少查找次數(shù)提高效率。例如:
function initUI(){ var doc = document, bd = doc.body, links = doc.getElementsByTagName("a"); .... }
當(dāng)函數(shù)執(zhí)行完成,活動(dòng)對(duì)象也會(huì)隨之銷毀。但閉包時(shí),活動(dòng)對(duì)象并不會(huì)銷毀。這也是為什么閉包占用內(nèi)存大的原因。
資料:《高性能JavaScript》第2章節(jié)
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/102186.html
摘要:之前一篇文章我們?cè)敿?xì)說(shuō)明了變量對(duì)象,而這里,我們將詳細(xì)說(shuō)明作用域鏈。而的作用域鏈,則同時(shí)包含了這三個(gè)變量對(duì)象,所以的執(zhí)行上下文可如下表示。下圖展示了閉包的作用域鏈。其中為當(dāng)前的函數(shù)調(diào)用棧,為當(dāng)前正在被執(zhí)行的函數(shù)的作用域鏈,為當(dāng)前的局部變量。 showImg(https://segmentfault.com/img/remote/1460000008329355);初學(xué)JavaScrip...
摘要:作用域執(zhí)行上下文變量提前函數(shù)聲明提前確定值范圍一段或者一個(gè)函數(shù)都會(huì)生成一個(gè)執(zhí)行上下文全局一段變量定義函數(shù)聲明函數(shù)變量定義函數(shù)聲明參數(shù)集合變量提前代碼解析執(zhí)行過(guò)程變量定義提前賦值函數(shù)聲明提前代碼解析函數(shù)聲明函數(shù)表達(dá)式執(zhí)行過(guò)程執(zhí)行過(guò)程執(zhí)行時(shí)才能 1.作用域 執(zhí)行上下文 (變量提前、函數(shù)聲明提前、確定this值、arguments) 范圍:一段或者一個(gè)函數(shù)(都會(huì)生成一個(gè)執(zhí)行上下文) ...
摘要:在之前我們根絕對(duì)象的原型說(shuō)過(guò)了的原型鏈,那么同樣的萬(wàn)物皆對(duì)象,函數(shù)也同樣存在這么一個(gè)鏈?zhǔn)降年P(guān)系,就是函數(shù)的作用域鏈作用域鏈?zhǔn)紫认葋?lái)回顧一下之前講到的原型鏈的尋找機(jī)制,就是實(shí)例會(huì)先從本身開始找,沒有的話會(huì)一級(jí)一級(jí)的網(wǎng)上翻,直到頂端沒有就會(huì)報(bào)一 在之前我們根絕對(duì)象的原型說(shuō)過(guò)了js的原型鏈,那么同樣的js 萬(wàn)物皆對(duì)象,函數(shù)也同樣存在這么一個(gè)鏈?zhǔn)降年P(guān)系,就是函數(shù)的作用域鏈 作用域鏈 首先先來(lái)回...
摘要:圖片中的作用域鏈,是全局執(zhí)行環(huán)境中的作用域鏈。然后此活動(dòng)對(duì)象被推入作用域鏈的最前端。在最后調(diào)用的時(shí)候,創(chuàng)建先構(gòu)建作用域鏈,再創(chuàng)建執(zhí)行環(huán)境,再創(chuàng)建執(zhí)行環(huán)境的時(shí)候發(fā)現(xiàn)了一個(gè)變量標(biāo)識(shí)符。 從圖書館翻過(guò)各種JS的書之后,對(duì)作用域/執(zhí)行環(huán)境/閉包這些概念有了一個(gè)比較清晰的認(rèn)識(shí)。 栗子說(shuō)明一切 第一個(gè)栗子 來(lái)看一個(gè)來(lái)自ECMA-262的栗子: var x = 10; (function foo(...
摘要:在的開發(fā)者工具中,通過(guò)斷點(diǎn)調(diào)試,我們能夠非常方便的一步一步的觀察的執(zhí)行過(guò)程,直觀感知函數(shù)調(diào)用棧,作用域鏈,變量對(duì)象,閉包,等關(guān)鍵信息的變化。其中表示當(dāng)前的局部變量對(duì)象,表示當(dāng)前作用域鏈中的閉包。 showImg(https://segmentfault.com/img/remote/1460000008404321); 在前端開發(fā)中,有一個(gè)非常重要的技能,叫做斷點(diǎn)調(diào)試。 在chrome...
閱讀 3247·2021-11-22 12:07
閱讀 1887·2021-10-12 10:11
閱讀 1051·2019-08-30 15:44
閱讀 2951·2019-08-30 12:45
閱讀 2215·2019-08-29 16:41
閱讀 1646·2019-08-29 16:35
閱讀 2637·2019-08-29 12:57
閱讀 1158·2019-08-26 13:51