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

資訊專欄INFORMATION COLUMN

全面了解JS作用域

Eidesen / 742人閱讀

摘要:塊作用域在中沒有塊作用域也就是說在中聲明的變量會泄露到外面作用域而中新增的可以將變量綁定到所在的任意作用域通常是內(nèi)部,換句話說,為其聲明的變量隱式的劫持了所在的塊作用域。總結(jié)作用域其實是有執(zhí)行上下文中的變量對象和作用域鏈共同構(gòu)成的。

執(zhí)行上下文(也稱執(zhí)行環(huán)境)堆棧

執(zhí)行上下文是javascript最重要的一個概念,執(zhí)行上下文定義了變量或函數(shù)有權(quán)訪問的其他數(shù)據(jù),決定了它們各自的行為。而在javascript中有三種執(zhí)行上下文: 全局執(zhí)行上下文, 函數(shù)執(zhí)行上下文, eval執(zhí)行上下文。代碼在其執(zhí)行上下文中執(zhí)行。在javascript中只有一個全局執(zhí)行環(huán)境(根據(jù)宿主環(huán)境的不同,全局執(zhí)行環(huán)境的對象也不一樣)。可以有許多函數(shù)和eval執(zhí)行環(huán)境的實例,每次調(diào)用一個函數(shù)或eval,都會進(jìn)入對應(yīng)執(zhí)行環(huán)境執(zhí)行代碼。注意一個函數(shù)可能會產(chǎn)生無限上下文集合,因為每次函數(shù)調(diào)用自身都會產(chǎn)生一個新的執(zhí)行上下文

執(zhí)行上下文可以激活另一個執(zhí)行上下文,例如函數(shù)調(diào)用另一個函數(shù)(或者全局執(zhí)行上下文調(diào)用全局函數(shù))等等,邏輯上就成了一個堆棧。這被稱為執(zhí)行上下文堆棧。
當(dāng)執(zhí)行流進(jìn)入一個函數(shù)時,函數(shù)的上下文就會被推入一個棧中,如果在當(dāng)前函數(shù)中調(diào)用另一個函數(shù),當(dāng)前函數(shù)就會暫停執(zhí)行,并將執(zhí)行流傳遞給被調(diào)用函數(shù)(被調(diào)用函數(shù)同事可能是其他函數(shù)的調(diào)用者),被調(diào)用者被推入堆棧。當(dāng)被調(diào)用者的上下文結(jié)束后,將執(zhí)行流交還給調(diào)用者,調(diào)用者的繼續(xù)運行代碼,直到結(jié)束后,棧將上下文彈出。

執(zhí)行上下文

每個執(zhí)行上下文可以抽象成一個對象,都包含了一組屬性。

變量對象(variable object)

每個執(zhí)行上下文都有一個與之關(guān)聯(lián)的變量對象,環(huán)境中定義的所有變量和函數(shù)都保存在這個對象。但是不包含函數(shù)表達(dá)式和this(因為他不是一個變量)。

var foo = 10;
function bar(){};
(function baz(){})

console.log(baz); //eror

全局上下文的變量對象

如果執(zhí)行上下文是一個函數(shù),則將其活動對象作為變量對象,除了變量和函數(shù)聲明之外,他還存儲形式參數(shù)和arguments對象。

function foo(x, y) {
  var z = 30;
  function bar() {} 
  (function baz() {}); 
}
 
foo(10, 20);

我們發(fā)現(xiàn)baz不在活動對象里。

作用域鏈(scope chain)

作用域鏈本質(zhì)上就是根據(jù)名稱查找變量(標(biāo)識符名稱)的一套規(guī)則。規(guī)則非常簡單,在自己的變量對象里找不到變量,就上父級的變量對象查找,當(dāng)?shù)诌_(dá)最外層的全局上下文中,無論找到還是沒找到,查找過程都會停止。查找會在找到第一個匹配的變量時停止,被稱為遮蔽效應(yīng)

var x = 10;
(function foo(){
    var y = 10;
    (function bar(){
        var z = 10;
        console.log(x+y+z)![scope-chain.png][6]
    })
})

如下圖:

作用域知識點
詞法作用域

詞法作用域就是定義在詞法階段的作用域。換句話說,詞法作用域是由你在寫代碼時將變量和塊作用域?qū)懺谀睦餂Q定的,無論函數(shù)在哪里被調(diào)用,也無論他如何被調(diào)用,他的詞法作用域只由函數(shù)被聲明位置決定

欺騙詞法

在javascript中的eval函數(shù)可以接受一個字符串為參數(shù),并將其中的內(nèi)容視為在書寫時就存在于程序中這個位置的代碼。

function foo(str, a){
    eval(str); //欺騙
    console.log(a, b);
}
var b = 2;
foo("var b = 3;", 1); //1, 3
函數(shù)作用域

函數(shù)作用域有兩種方式

//函數(shù)聲明
function foo(){
    var a = 3;
    console.log(a);
}
//函數(shù)表達(dá)式
(function foo(){
    var a = 2;
    console.log(a);
})

兩者的區(qū)別在于它們的名稱標(biāo)識符會被綁定到何處,第一段代碼中會被綁定到所在作用域中,第二段代碼被綁定在函數(shù)表達(dá)式自身的函數(shù)中而不是所在作用域中。

塊作用域

在javascript中沒有塊作用域,也就是說在{...}中聲明的變量會泄露到外面作用域

if(true){
    var foo = "dog"
}
console.log(foo); //dog

function dosomething(i){
    console.log(i);
}

for(var i = 0; i < 10; i++){
    dosomething(i);
}
console.log(i);

而ES6中新增的let可以將變量綁定到所在的任意作用域(通常是{...}內(nèi)部),換句話說,let為其聲明的變量隱式的劫持了所在的塊作用域。

if(true){
    var foo = "dog"
}
console.log(foo); //dog

function dosomething(i){
    console.log(i);
}

for(let i = 0; i < 10; i++){
    dosomething(i);
}
console.log(i); //error
總結(jié)

作用域其實是有執(zhí)行上下文中的變量對象和作用域鏈共同構(gòu)成的。

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

轉(zhuǎn)載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/84920.html

相關(guān)文章

  • 深入貫徹閉包思想,全面理解JS閉包形成過程

    摘要:下面我們就羅列閉包的幾個常見問題,從回答問題的角度來理解和定義你們心中的閉包。函數(shù)可以通過作用域鏈相互關(guān)聯(lián)起來,函數(shù)內(nèi)部的變量可以保存在其他函數(shù)作用域內(nèi),這種特性在計算機(jī)科學(xué)文獻(xiàn)中稱為閉包。 寫這篇文章之前,我對閉包的概念及原理模糊不清,一直以來都是以通俗的外層函數(shù)包裹內(nèi)層....來欺騙自己。并沒有說這種說法的對與錯,我只是不想擁有從眾心理或者也可以說如果我們說出更好更低層的東西,逼格...

    snowell 評論0 收藏0
  • 前端知識點整理

    摘要:難怪超過三分之一的開發(fā)人員工作需要一些知識。但是隨著行業(yè)的飽和,初中級前端就業(yè)形勢不容樂觀。整個系列的文章大概有篇左右,從我是如何成為一個前端工程師,到各種前端框架的知識。 為什么 call 比 apply 快? 這是一個非常有意思的問題。 作者會在參數(shù)為3個(包含3)以內(nèi)時,優(yōu)先使用 call 方法進(jìn)行事件的處理。而當(dāng)參數(shù)過多(多余3個)時,才考慮使用 apply 方法。 這個的原因...

    Lowky 評論0 收藏0
  • 前端知識點整理

    摘要:難怪超過三分之一的開發(fā)人員工作需要一些知識。但是隨著行業(yè)的飽和,初中級前端就業(yè)形勢不容樂觀。整個系列的文章大概有篇左右,從我是如何成為一個前端工程師,到各種前端框架的知識。 為什么 call 比 apply 快? 這是一個非常有意思的問題。 作者會在參數(shù)為3個(包含3)以內(nèi)時,優(yōu)先使用 call 方法進(jìn)行事件的處理。而當(dāng)參數(shù)過多(多余3個)時,才考慮使用 apply 方法。 這個的原因...

    snowLu 評論0 收藏0
  • JS基礎(chǔ)知識:變量對象、作用鏈和閉包

    摘要:前言這段時間一直在消化作用域鏈和閉包的相關(guān)知識。而作用域鏈則是這套規(guī)則這套規(guī)則的具體運行。是變量對象的縮寫那這樣放有什么好處呢我們知道作用域鏈保證了當(dāng)前執(zhí)行環(huán)境對符合訪問權(quán)限的變量和函數(shù)的有序訪問。 前言:這段時間一直在消化作用域鏈和閉包的相關(guān)知識。之前看《JS高程》和一些技術(shù)博客,對于這些概念的論述多多少少不太清楚或者不太完整,包括一些大神的技術(shù)文章。這也給我的學(xué)習(xí)上造成了一些困惑,...

    Keven 評論0 收藏0
  • javascript引擎執(zhí)行的過程的理解--語法分析和預(yù)編譯階段

    摘要:所以覺得把這個執(zhí)行的詳細(xì)過程整理一下,幫助更好的理解。類似的語法報錯的如下圖所示三預(yù)編譯階段代碼塊通過語法分析階段之后,語法都正確的下回進(jìn)入預(yù)編譯階段。另開出新文章詳細(xì)分析,主要介紹執(zhí)行階段中的同步任務(wù)執(zhí)行和異步任務(wù)執(zhí)行機(jī)制事件循環(huán)。 一、概述 js是一種非常靈活的語言,理解js引擎的執(zhí)行過程對于我們學(xué)習(xí)js是非常有必要的。看了很多這方便文章,大多數(shù)是講的是事件循環(huán)(event loo...

    molyzzx 評論0 收藏0

發(fā)表評論

0條評論

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