<span id="mktg5"></span>

<i id="mktg5"><meter id="mktg5"></meter></i>

        <label id="mktg5"><meter id="mktg5"></meter></label>
        最新文章專題視頻專題問答1問答10問答100問答1000問答2000關鍵字專題1關鍵字專題50關鍵字專題500關鍵字專題1500TAG最新視頻文章推薦1 推薦3 推薦5 推薦7 推薦9 推薦11 推薦13 推薦15 推薦17 推薦19 推薦21 推薦23 推薦25 推薦27 推薦29 推薦31 推薦33 推薦35 推薦37視頻文章20視頻文章30視頻文章40視頻文章50視頻文章60 視頻文章70視頻文章80視頻文章90視頻文章100視頻文章120視頻文章140 視頻2關鍵字專題關鍵字專題tag2tag3文章專題文章專題2文章索引1文章索引2文章索引3文章索引4文章索引5123456789101112131415文章專題3
        問答文章1 問答文章501 問答文章1001 問答文章1501 問答文章2001 問答文章2501 問答文章3001 問答文章3501 問答文章4001 問答文章4501 問答文章5001 問答文章5501 問答文章6001 問答文章6501 問答文章7001 問答文章7501 問答文章8001 問答文章8501 問答文章9001 問答文章9501
        當前位置: 首頁 - 科技 - 知識百科 - 正文

        深入理解ES6學習筆記之塊級作用域綁定

        來源:懂視網 責編:小采 時間:2020-11-27 22:32:23
        文檔

        深入理解ES6學習筆記之塊級作用域綁定

        深入理解ES6學習筆記之塊級作用域綁定:眾所周知,js中的var聲明存在變量提升機制,因此ESMAScript 6引用了塊級作用域來強化對變量生命周期的控制 let const 聲明不會被提升,有幾個需要注意的點 1、不能被重復聲明 假設作用域中已經存在某個標識符(無論該標識符是通過var聲明還是let、co
        推薦度:
        導讀深入理解ES6學習筆記之塊級作用域綁定:眾所周知,js中的var聲明存在變量提升機制,因此ESMAScript 6引用了塊級作用域來強化對變量生命周期的控制 let const 聲明不會被提升,有幾個需要注意的點 1、不能被重復聲明 假設作用域中已經存在某個標識符(無論該標識符是通過var聲明還是let、co

        眾所周知,js中的var聲明存在變量提升機制,因此ESMAScript 6引用了塊級作用域來強化對變量生命周期的控制
        let const 聲明不會被提升,有幾個需要注意的點

        1、不能被重復聲明

        假設作用域中已經存在某個標識符(無論該標識符是通過var聲明還是let、const變量聲明),此時再使用let或const關鍵定聲明會拋錯

        var count=10
        let count=20// 此處則會拋出錯誤,因為同一作用域內不能重復聲明
        

        如果當前作用域內嵌另一個作用域,便可在內嵌的作用域中用let聲明同名變量

        var count=10
        if(true){
         let count=20
        }

        2、const聲明的常量必須進行初始化

        像下面這樣聲明就會報錯

        const name;//語法錯誤,常量未初始化

        3、不可以為const定義的常量再賦值,真正的本質是const聲明不允許修改綁定,但允許修改值(也就是說const聲明對象后,可以修改該對象的屬性值)

        const person={
         name:'angela'
        }
        //可以修改對象屬性的值
        person.name='yun'
        // 修改綁定則會拋出語法錯誤
        person={
         'name':'Shining'
        }

        4、臨時性死區(Temporal Dead Zone)

        JavaScript引擎在掃描代碼發現變量聲明時,要么將它們提升至作用域頂部(遇到var聲明),要么將聲明放到TDZ中(遇到let和const聲明),訪問TDZ中的變量會觸發運行時錯誤,只有執行過變量聲明語句后,變量才會從TDZ中移出,才能正常訪問
        如下代碼就因為在if塊級作用域內執行console.log時value已經在TDZ中了,以前typeof是一個相對不易出錯的操作符,但其實也無法阻擋引擎拋出錯誤

        在聲明前訪問塊級綁定會導致錯誤,因為綁定在臨時死區中

        if (true) {
         console.log(typeof value)//引用錯誤
         let value = 'blue'
        }

        而在let聲明的作用域外對該變量使用typeof則不會報錯

        console.log(typeof value)
        if (true) { 
         let value = 'blue'
        }

        5、塊級作用域綁定

        之前在循環中創建函數都有些不可言狀

        var funcs = []
        for (var i = 0; i < 10; i++) {
         funcs.push(function () {
         console.log(i)
         })
        }
        funcs.forEach(function (func) {
         func()
        })
        

        因為循環內部創建的函數全部都保留了對相同變量的引用,循環結束時變量i的值為10,所以結果會輸出10次10

        于是大家會在循環中使用立即調用函數表達式,以強制生成計數器變量的副本,以便輸出1、2、3......

        var funcs = []
        for (var i = 0; i < 10; i++) {
        
         funcs.push((function (value) {
         return function () {
         console.log(value)
         }
         })(i))
        
        }
        funcs.forEach(function (func) {
         func()
        })
        

        有了let,立即調用函數表達式則可以簡化,其實每次迭代循環都會創建一個新變量,并以之前迭代中同名變量的值將其初始化

        var funcs = []
        for (let i = 0; i < 10; i++) {
        //其實是每次循環的時候let聲明都會創建一個新變量i并將其初始化為i的當前值,所以在循環內部創建的每個函數都能得到屬于它們自己的i的副本
         funcs.push(function () {
         console.log(i)
         })
        }
        funcs.forEach(function (func) {
         func()//這里
        輸出是0 然后是1、2....9 })

        這個特性同樣適用于for in中,舉例來說

        var funcs = [],
         obj = {
         a: true,
         b: true,
         c: true
         }
        for (let key in obj) {
         funcs.push(function () {
         console.log(key)
         })
        }
        funcs.forEach(function (func) {
         func()//
        輸出的是a b c })

        6、循環中的let聲明特性同樣適用于const聲明,唯一的區別是const不能更改綁定

        上面的例子中把let換成const同樣輸出a b c

        var funcs = [],
         obj = {
         a: true,
         b: true,
         c: true
         }
        //之所以可以運用for in 和for of循環中,是因為每次迭代不會修改已有綁定,而是會創建一個新綁定
        for (const key in obj) {
         funcs.push(function () {
         console.log(key)// 同樣
        輸出a b c 唯一的區別是循環內不能更改key的值 }) } funcs.forEach(function (func) { func() })

        下面的這個例子則會報錯,因為在for循環中更改了i的綁定而const常量不能更改綁定

        var funcs = []
        for (const i = 0; i < 10; i++) {
         funcs.push(function () {
         console.log(i)
         })
        }
        funcs.forEach(function (func) {
         func()
        })
        

        7、全局作用域綁定

        當var被作用于全局作用域時,它會創建一個新的全局變量作用全局對象(瀏覽器環境中的window對象)的屬性,這意味著用var很可能會無意中覆蓋一個已經存在的全局變量

        從上圖代碼中看出即便是全局對象RegExp Array都會被覆蓋

        但是let或const會在全局作用域下創建一個新的綁定,但該綁定不會添加為全局對象的屬性,換句話說用let或const不能覆蓋全局變量,而只能遮蔽它

        這個時候的RegExp和window.RegExp是不相同的

        let RegExp='hello'
        console.log(RegExp) //hello
        console.log(window.RegExp===RegExp)//false
        
        const ncz='hi'
        console.log(ncz)
        console.log("ncz" in window)
        

        最佳實踐:

        默認使用let而不是var

        默認使用const,只有確實需要改變變量的值時使用let

        聲明:本網頁內容旨在傳播知識,若有侵權等問題請及時與本網聯系,我們將在第一時間刪除處理。TEL:177 7030 7066 E-MAIL:11247931@qq.com

        文檔

        深入理解ES6學習筆記之塊級作用域綁定

        深入理解ES6學習筆記之塊級作用域綁定:眾所周知,js中的var聲明存在變量提升機制,因此ESMAScript 6引用了塊級作用域來強化對變量生命周期的控制 let const 聲明不會被提升,有幾個需要注意的點 1、不能被重復聲明 假設作用域中已經存在某個標識符(無論該標識符是通過var聲明還是let、co
        推薦度:
        標簽: 筆記 作用域 ES6
        • 熱門焦點

        最新推薦

        猜你喜歡

        熱門推薦

        專題
        Top
        主站蜘蛛池模板: 最近更新免费中文字幕大全| 免费播放国产性色生活片| 青青青视频免费观看| 在线观看无码AV网站永久免费| 国产v亚洲v天堂无码网站| 国产精品黄页免费高清在线观看| 亚洲成人影院在线观看| 日韩色视频一区二区三区亚洲 | 美女无遮挡拍拍拍免费视频| 亚洲成A人片在线观看中文| 国产99视频精品免费视频76| 在线日韩日本国产亚洲| 中文字幕乱码免费看电影| 亚洲AV天天做在线观看| 久久久久国产精品免费网站| 久久亚洲精品无码VA大香大香| 黄色免费在线网站| 亚洲精品午夜久久久伊人| 亚洲一区二区三区免费视频| 亚洲欧洲另类春色校园网站| 成人永久福利免费观看| 日本精品久久久久久久久免费 | 亚洲人成色777777老人头| 全部免费毛片免费播放| 男女一边桶一边摸一边脱视频免费 | 亚洲AV午夜福利精品一区二区| 免费无遮挡无码永久视频| 久久亚洲精品国产亚洲老地址 | 亚洲国产成人一区二区精品区 | 亚洲婷婷在线视频| 浮力影院第一页小视频国产在线观看免费 | 大学生一级毛片免费看| 精品女同一区二区三区免费播放 | 久久精品无码专区免费青青| 精品亚洲AV无码一区二区三区| 免费无码又爽又刺激高潮| 中文字幕免费在线看电影大全 | 日本免费污片中国特一级| 亚洲影视自拍揄拍愉拍| 亚洲无码黄色网址| 日本最新免费网站|