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

資訊專欄INFORMATION COLUMN

《深入理解ES6》筆記——塊級作用域綁定(1)

2bdenny / 2650人閱讀

摘要:沒有聲明的情況和都能夠聲明塊級作用域,用法和是類似的,的特點是不會變量提升,而是被鎖在當前塊中。聲明常量,一旦聲明,不可更改,而且常量必須初始化賦值。臨時死區(qū)的意思是在當前作用域的塊內(nèi),在聲明變量前的區(qū)域叫做臨時死區(qū)。

本章涉及3個知識點,var、let、const,現(xiàn)在讓我們了解3個關(guān)鍵字的特性和使用方法。

var

JavaScript中,我們通常說的作用域是函數(shù)作用域,使用var聲明的變量,無論是在代碼的哪個地方聲明的,都會提升到當前作用域的最頂部,這種行為叫做變量提升(Hoisting)

也就是說,如果在函數(shù)內(nèi)部聲明的變量,都會被提升到該函數(shù)開頭,而在全局聲明的變量,就會提升到全局作用域的頂部。

function test() {
    console.log("1: ", a) //undefined
    if (false) {
      var a = 1
    }
    console.log("3: ", a) //undefined
}

test()

實際執(zhí)行時,上面的代碼中的變量a會提升到函數(shù)頂部聲明,即使if語句的條件是false,也一樣不影響a變量提升。

function test() {
    var a
    //a聲明沒有賦值
    console.log("1: ", a) //undefined
    if (false) {
      a = 1
    }
    //a聲明沒有賦值
    console.log("3: ", a) //undefined
}

在函數(shù)嵌套函數(shù)的場景下,變量只會提升到最近的一個函數(shù)頂部,而不會。

//b提升到函數(shù)a頂部,但不會提升到函數(shù)test。
function test() {
    function a() {
      if (false) {
        var b = 2
      }
    }
    console.log("b: ", b)
}

test() //b is not defined

如果a沒有聲明,那么就會報錯,沒有聲明和聲明后沒有賦值是不一樣的,這點一定要區(qū)分開,有助于我們找bug。

//a沒有聲明的情況
a is not defined
let

let和const都能夠聲明塊級作用域,用法和var是類似的,let的特點是不會變量提升,而是被鎖在當前塊中。

一個非常簡單的例子:

function test() {
    if(true) {
      console.log(a)//TDZ,俗稱臨時死區(qū),用來描述變量不提升的現(xiàn)象
      let a = 1
    }
}
test()  // a is not defined

function test() {
    if(true) {
      let a = 1
    }
    console.log(a)
}    
test() // a is not defined

唯一正確的使用方法:先聲明,再訪問。

function test() {
    if(true) {
      let a = 1
      console.log(a)
    }
}
test() // 1
const

聲明常量,一旦聲明,不可更改,而且常量必須初始化賦值。

const type = "ACTION"

我們試試重新聲明type,看看會報什么錯:

const type = "ACTION"
type = 1
console.log(type) //"type" is read-only

const type = "ACTION"
let type = 1
console.log(type) //Duplicate declaration "type"

const雖然是常量,不允許修改默認賦值,但如果定義的是對象Object,那么可以修改對象內(nèi)部的屬性值。

const type = {
  a: 1
}
type.a = 2 //沒有直接修改type的值,而是修改type.a的屬性值,這是允許的。
console.log(type) // {a: 2}
const和let的異同點

相同點:const和let都是在當前塊內(nèi)有效,執(zhí)行到塊外會被銷毀,也不存在變量提升(TDZ),不能重復(fù)聲明。

不同點:const不能再賦值,let聲明的變量可以重復(fù)賦值。

臨時死區(qū)(TDZ)

上面我們也提到了TDZ的場景,那么,有什么用呢?答案就是沒什么用。

臨時死區(qū)的意思是在當前作用域的塊內(nèi),在聲明變量前的區(qū)域叫做臨時死區(qū)。

if (true) {
  //這塊區(qū)域是TDZ
  let a = 1
}
塊級作用域的使用場景

除了上面提到的常用聲明方式,我們還可以在循環(huán)中使用,最出名的一道面試題:循環(huán)中定時器閉包的考題

在for循環(huán)中使用var聲明的循環(huán)變量,會跳出循環(huán)體污染當前的函數(shù)。

for(var i = 0; i < 5; i++) {
  setTimeout(() => {
    console.log(i) //5, 5, 5, 5, 5
  }, 0)
}
console.log(i) //5 i跳出循環(huán)體污染外部函數(shù)

//將var改成let之后
for(let i = 0; i < 5; i++) {
  setTimeout(() => {
    console.log(i) // 0,1,2,3,4
  }, 0)
}
console.log(i)//i is not defined i無法污染外部函數(shù)

關(guān)于這個使用場景的具體分析可以查看我寫的另外一篇文章:JavaScript同步、異步、回調(diào)執(zhí)行順序之經(jīng)典閉包setTimeout面試題分析

在全局作用域聲明

如果在全局作用域使用let或者const聲明,當聲明的變量本身就是全局屬性,比如closed。只會覆蓋該全局變量,而不會替換它。

window.closed = false
let closed = true

closed // true
window.closed // false
最佳實踐

在實際開發(fā)中,我們選擇使用var、let還是const,取決于我們的變量是不是需要更新,通常我們希望變量保證不被惡意修改,而使用大量的const,在react中,props傳遞的對象是不可更改的,所以使用const聲明,聲明一個對象的時候,也推薦使用const,當你需要修改聲明的變量值時,使用let,var能用的場景都可以使用let替代。

=> 返回文章目錄

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

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

相關(guān)文章

  • 深入理解ES6筆記(一)塊級作用綁定

    摘要:和都能夠聲明塊級作用域,用法和是類似的,的特點是不會變量提升,而是被鎖在當前塊中。聲明常量,一旦聲明,不可更改,而且常量必須初始化賦值。臨時死區(qū)臨時死區(qū)的意思是在當前作用域的塊內(nèi),在聲明變量前的區(qū)域叫做臨時死區(qū)。 主要知識點有:var變量提升、let聲明、const聲明、let和const的比較、塊級綁定的應(yīng)用場景showImg(https://segmentfault.com/img...

    馬忠志 評論0 收藏0
  • 深入理解ES6 (一) 塊級綁定

    摘要:聲明聲明的語法與的語法一致??偨Y(jié)文章都是以深入理解讀書筆記形式,大部分引用書中的定義,加上作者的理解,樣例也做了調(diào)整,所有樣例都可以放到里運行親自嘗試。 1.變量提升 使用 var 關(guān)鍵字聲明的變量,無論其實際聲明位置在何處,都會被視為聲明于所在函數(shù)的 頂部(如果聲明不在任意函數(shù)內(nèi),則視為在全局作用域的頂部)。這句話從字面上不難理解。 但是他是怎樣一個過程,為什么會這樣。當你代...

    KunMinX 評論0 收藏0
  • 【進階2-3期】JavaScript深入之閉包面試題解

    摘要:閉包面試題解由于作用域鏈機制的影響,閉包只能取得內(nèi)部函數(shù)的最后一個值,這引起的一個副作用就是如果內(nèi)部函數(shù)在一個循環(huán)中,那么變量的值始終為最后一個值。 (關(guān)注福利,關(guān)注本公眾號回復(fù)[資料]領(lǐng)取優(yōu)質(zhì)前端視頻,包括Vue、React、Node源碼和實戰(zhàn)、面試指導(dǎo)) 本周正式開始前端進階的第二期,本周的主題是作用域閉包,今天是第8天。 本計劃一共28期,每期重點攻克一個面試重難點,如果你還不了...

    alanoddsoff 評論0 收藏0
  • 深入理解ES6筆記——函數(shù)(3)

    摘要:錯誤的寫法錯誤的寫法中的構(gòu)造函數(shù)新增了支持默認參數(shù)和不定參數(shù)。箭頭函數(shù)的簡單理解箭頭函數(shù)的左邊表示輸入的參數(shù),右邊表示輸出的結(jié)果。但是有了尾調(diào)用優(yōu)化之后,遞歸函數(shù)的性能有了提升。 作為前端切圖仔,越發(fā)覺得自己離不開函數(shù)了。 說到JavaScript函數(shù),腦子里都是匿名函數(shù)、普通函數(shù)、閉包函數(shù)、構(gòu)造函數(shù)......然后還能說出一大堆函數(shù)的概念。如果你達到這個水平,那么函數(shù)對你來說沒有難度...

    DoINsiSt 評論0 收藏0

發(fā)表評論

0條評論

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