成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

JavaScript作用域鏈與閉包的理解

BaronZhang / 647人閱讀

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

作用域是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); //腳本錯誤
doSomething(); //mengera88
innerSay() //腳本錯誤

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

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

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

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

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

2.局部作用域

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

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

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

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

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

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

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

 var total = add(5,10);

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

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

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

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

轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/49591.html

相關(guān)文章

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

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

    aikin 評論0 收藏0
  • JavaScript作用鏈與閉包理解

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

    darcrand 評論0 收藏0
  • JavaScript作用鏈與閉包理解

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

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

    摘要:在的開發(fā)者工具中,通過斷點調(diào)試,我們能夠非常方便的一步一步的觀察的執(zhí)行過程,直觀感知函數(shù)調(diào)用棧,作用域鏈,變量對象,閉包,等關(guān)鍵信息的變化。其中表示當(dāng)前的局部變量對象,表示當(dāng)前作用域鏈中的閉包。 showImg(https://segmentfault.com/img/remote/1460000008404321); 在前端開發(fā)中,有一個非常重要的技能,叫做斷點調(diào)試。 在chrome...

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

    摘要:圖片中的作用域鏈,是全局執(zhí)行環(huán)境中的作用域鏈。然后此活動對象被推入作用域鏈的最前端。在最后調(diào)用的時候,創(chuàng)建先構(gòu)建作用域鏈,再創(chuàng)建執(zhí)行環(huán)境,再創(chuàng)建執(zhí)行環(huán)境的時候發(fā)現(xiàn)了一個變量標(biāo)識符。 從圖書館翻過各種JS的書之后,對作用域/執(zhí)行環(huán)境/閉包這些概念有了一個比較清晰的認識。 栗子說明一切 第一個栗子 來看一個來自ECMA-262的栗子: var x = 10; (function foo(...

    Drummor 評論0 收藏0

發(fā)表評論

0條評論

最新活動
閱讀需要支付1元查看
<