国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

JavaScript作用域鏈與閉包的理解

tianhang / 1499人閱讀

摘要:作用域是最重要的概念之一,想要學(xué)好就需要理解作用域和作用域鏈的工作原理。腳本錯(cuò)誤腳本錯(cuò)誤由此可以引發(fā)作用域鏈的概念在中,函數(shù)也是對(duì)象,實(shí)際上,里一切都是對(duì)象。當(dāng)一個(gè)函數(shù)創(chuàng)建后,它的作用域鏈會(huì)被創(chuàng)建此函數(shù)的作用域中可訪問的數(shù)據(jù)對(duì)象填充。

作用域是JavaScript最重要的概念之一,想要學(xué)好JavaScript就需要理解JavaScript作用域和作用域

鏈的工作原理。

1. 全局作用域(Global Scope)

(1)最外層函數(shù)和在最外層函數(shù)外面定義的變量擁有全局作用域,例如:

var authorName="Jessica";
function doSomething(){
    var blogName="mengera88";
    function innerSay(){
        alert(blogName);
    }
    innerSay();
}
alert(authorName); //Jessica
alert(blogName); //腳本錯(cuò)誤
doSomething(); //mengera88
innerSay() //腳本錯(cuò)誤

(2)所有末定義直接賦值的變量自動(dòng)聲明為擁有全局作用域,例如:

function doSomething(){
    var authorName="Jessica";
    blogName="mengera88";
    alert(authorName);
}
doSomething(); //Jessica
alert(blogName); //mengera88
alert(authorName); //腳本錯(cuò)誤

  變量blogName擁有全局作用域,而authorName在函數(shù)外部無(wú)法訪問到。

(3)所有window對(duì)象的屬性擁有全局作用域

  一般情況下,window對(duì)象的內(nèi)置屬性都擁有全局作用域,例如window.name、window.location、window.top等等。

2.局部作用域

和全局作用域相反,局部作用域一般只在固定的代碼片段內(nèi)可訪問到,最常見的例如函數(shù)內(nèi)部,所有在 一些地方也會(huì)看到有人把這種作用域稱為函數(shù)作用域,例如下列代碼中的blogName和函數(shù)innerSay都 只擁有局部作用域。

 function doSomething(){
    var blogName="Jessica";
    function innerSay(){
        alert(blogName);
    }
    innerSay();
 }
 alert(blogName); //腳本錯(cuò)誤
 innerSay(); //腳本錯(cuò)誤

由此可以引發(fā)作用域鏈的概念:

在JavaScript中,函數(shù)也是對(duì)象,實(shí)際上,JavaScript里一切都是對(duì)象。函數(shù)對(duì)象和其它對(duì)象一樣,擁有可以通過代碼訪問的屬性和一系列僅供JavaScript引擎訪問的內(nèi)部屬性。其中一個(gè)內(nèi)部屬性是[[Scope]],由ECMA-262標(biāo)準(zhǔn)第三版定義,該內(nèi)部屬性包含了函數(shù)被創(chuàng)建的作用域中對(duì)象的集合,這個(gè)集合被稱為函數(shù)的作用域鏈,它決定了哪些數(shù)據(jù)能被函數(shù)訪問。

  當(dāng)一個(gè)函數(shù)創(chuàng)建后,它的作用域鏈會(huì)被創(chuàng)建此函數(shù)的作用域中可訪問的數(shù)據(jù)對(duì)象填充。例如定義下面這樣一個(gè)函數(shù):

function add(num1,num2) {
    var sum = num1 + num2;
    return sum;
}

在函數(shù)add創(chuàng)建時(shí),它的作用域鏈中會(huì)填入一個(gè)全局對(duì)象,該全局對(duì)象包含了所有全局變量,函數(shù)add的作 用域?qū)?huì)在執(zhí)行時(shí)用到。例如執(zhí)行如下代碼:

 var total = add(5,10);

執(zhí)行此函數(shù)時(shí)會(huì)創(chuàng)建一個(gè)稱為“運(yùn)行期上下文(execution context)”的內(nèi)部對(duì)象,運(yùn)行期上下文定義 了函數(shù)執(zhí)行時(shí)的環(huán)境。每個(gè)運(yùn)行期上下文都有自己的作用域鏈,用于標(biāo)識(shí)符解析,當(dāng)運(yùn)行期上下文被創(chuàng) 建時(shí),而它的作用域鏈初始化為當(dāng)前運(yùn)行函數(shù)的[[Scope]]所包含的對(duì)象。

這些值按照它們出現(xiàn)在函數(shù)中的順序被復(fù)制到運(yùn)行期上下文的作用域鏈中。它們共同組成了一個(gè)新的對(duì)象,叫“活動(dòng)對(duì)象(activation object)”,該對(duì)象包含了函數(shù)的所有局部變量、命名參數(shù)、參數(shù)集合以及this,然后此對(duì)象會(huì)被推入作用域鏈的前端,當(dāng)運(yùn)行期上下文被銷毀,活動(dòng)對(duì)象也隨之銷毀。

在函數(shù)執(zhí)行過程中,每遇到一個(gè)變量,都會(huì)經(jīng)歷一次標(biāo)識(shí)符解析過程以決定從哪里獲取和存儲(chǔ)數(shù)據(jù)。 該過程從作用域鏈頭部,也就是從活動(dòng)對(duì)象開始搜索,查找同名的標(biāo)識(shí)符, 如果找到了就使用這個(gè)標(biāo)識(shí)符對(duì)應(yīng)的變量,如果沒找到繼續(xù)搜索作用域鏈中的下一個(gè)對(duì)象, 如果搜索完所有對(duì)象都未找到,則認(rèn)為該標(biāo)識(shí)符未定義。函數(shù)執(zhí)行過程中,每個(gè)標(biāo)識(shí)符都要經(jīng)歷 這樣的搜索過程。

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://specialneedsforspecialkids.com/yun/111093.html

相關(guān)文章

  • 前端基礎(chǔ)進(jìn)階(四):詳細(xì)圖解作用鏈與閉包

    摘要:之前一篇文章我們?cè)敿?xì)說明了變量對(duì)象,而這里,我們將詳細(xì)說明作用域鏈。而的作用域鏈,則同時(shí)包含了這三個(gè)變量對(duì)象,所以的執(zhí)行上下文可如下表示。下圖展示了閉包的作用域鏈。其中為當(dāng)前的函數(shù)調(diào)用棧,為當(dāng)前正在被執(zhí)行的函數(shù)的作用域鏈,為當(dāng)前的局部變量。 showImg(https://segmentfault.com/img/remote/1460000008329355);初學(xué)JavaScrip...

    aikin 評(píng)論0 收藏0
  • JavaScript作用鏈與閉包理解

    摘要:作用域是最重要的概念之一,想要學(xué)好就需要理解作用域和作用域鏈的工作原理。腳本錯(cuò)誤腳本錯(cuò)誤由此可以引發(fā)作用域鏈的概念在中,函數(shù)也是對(duì)象,實(shí)際上,里一切都是對(duì)象。當(dāng)一個(gè)函數(shù)創(chuàng)建后,它的作用域鏈會(huì)被創(chuàng)建此函數(shù)的作用域中可訪問的數(shù)據(jù)對(duì)象填充。 作用域是JavaScript最重要的概念之一,想要學(xué)好JavaScript就需要理解JavaScript作用域和作用域 鏈的工作原理。 1. 全局作...

    darcrand 評(píng)論0 收藏0
  • JavaScript作用鏈與閉包理解

    摘要:作用域是最重要的概念之一,想要學(xué)好就需要理解作用域和作用域鏈的工作原理。腳本錯(cuò)誤腳本錯(cuò)誤由此可以引發(fā)作用域鏈的概念在中,函數(shù)也是對(duì)象,實(shí)際上,里一切都是對(duì)象。當(dāng)一個(gè)函數(shù)創(chuàng)建后,它的作用域鏈會(huì)被創(chuàng)建此函數(shù)的作用域中可訪問的數(shù)據(jù)對(duì)象填充。 作用域是JavaScript最重要的概念之一,想要學(xué)好JavaScript就需要理解JavaScript作用域和作用域 鏈的工作原理。 1. 全局作...

    BaronZhang 評(píng)論0 收藏0
  • 前端基礎(chǔ)進(jìn)階(六):在chrome開發(fā)者工具中觀察函數(shù)調(diào)用棧、作用鏈與閉包

    摘要:在的開發(fā)者工具中,通過斷點(diǎn)調(diào)試,我們能夠非常方便的一步一步的觀察的執(zhí)行過程,直觀感知函數(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...

    draveness 評(píng)論0 收藏0
  • “動(dòng)靜結(jié)合” 小白初探靜態(tài)(詞法)作用域,作用鏈與執(zhí)行環(huán)境(EC)

    摘要:圖片中的作用域鏈,是全局執(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í)符。 從圖書館翻過各種JS的書之后,對(duì)作用域/執(zhí)行環(huán)境/閉包這些概念有了一個(gè)比較清晰的認(rèn)識(shí)。 栗子說明一切 第一個(gè)栗子 來看一個(gè)來自ECMA-262的栗子: var x = 10; (function foo(...

    Drummor 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<