最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

詳細(xì)解析let和const命令

 更新時間:2022年06月24日 14:30:33   作者:??陳梵阿????  
這篇文章主要介紹了詳細(xì)解析let和const命令,let和const是es6中新增的命令,一般let用來聲明變量而const則用來聲明常量,更多相關(guān)內(nèi)容感興趣的小伙伴可以參考一下

let命令

基本用法

我們都知道let命令是用來聲明變量的,類似于var,但是通過let命令聲明的變量只在所在代碼塊內(nèi)有效。

let a = [];
for (let i = 0;i < 10; i++ ) {
    a[i] = function () {
        console.log(i);
    }
}
a[5](); // 5

如上代碼所示,使用的是let聲明的i,那么這個變量僅在塊級作用域內(nèi)有效,即只在每輪循環(huán)內(nèi)有效,所以每次循環(huán)的i其實都是一個新變量,所以最后輸出了5。

如果使用了var去申明i,那么這個i是在全局范圍內(nèi)都有效的,函數(shù)數(shù)組里的i都會指向同一個i,導(dǎo)出最后輸出的是最后一輪循環(huán)的i的值。

那就有了一個疑問,使用let聲明的i如果每一輪都是一個新變量,那怎么知道上一輪循環(huán)的值然后計算出本輪的值?

這是因為JavaScript引擎內(nèi)部會記住上一輪循環(huán)的值,初始化當(dāng)次循環(huán)的i時,會在上一輪循環(huán)的基礎(chǔ)上計算。

for循環(huán)還有一個特別的地方,就是設(shè)置循環(huán)變量的括號內(nèi)是一個父作用域,而循環(huán)體內(nèi)是一個單獨(dú)的子作用域。

特性

不存在變量提升:

不存在變量提升我們應(yīng)該都知道,在var命令中會發(fā)生“變量提升”,就是變量可以在聲明之前使用,而值是undefined。這種是比較奇怪的現(xiàn)象,因為他都還沒聲明怎么就可以使用呢?

所以。let命令改變了這種語法,通過let聲明的變量一定要在變量聲明后才能用,不然就會報錯。

console.log(b) // undefined
console.log(a) // 報錯ReferenceError
let a = 2;
var b = 1;

暫時性死區(qū)

只要塊級作用域內(nèi)存在Let命令,那么這個let聲明的變量就綁定了這個區(qū)域,不會受到外部的影響。

var num = 1;
if(true) {
    num = 2; // 報錯,ReferenceError
    let num;
}

如上面代碼所示,if代碼塊內(nèi)想要修改的是if外部的num,但是if內(nèi)部通過let聲明了一個num但為賦值,所以導(dǎo)致了通過let聲明的num綁定了這個塊級作用域(即if內(nèi)部這個塊級作用域),所以不會受到外部的num影響,所以對num賦值會報錯。

ES6明確規(guī)定了,如果在區(qū)塊內(nèi)存在let和const命令,那么這個區(qū)塊對這些命令聲明的變量從一開始就形成封閉的作用域,只要在聲明之前就使用這些變量,就會報做。也稱暫時性死區(qū)(temporal dead zone,簡稱TDZ)

當(dāng)然,這也造成了typeof變得不安全了,因為如果一個變量沒有聲明就使用typeof不會報錯,會返回一個undefined,但是現(xiàn)在不成立了,因為會報錯ReferenceError。

function bar(x = y, y = 2) {
    return[x,y] 
}
bar() // 報錯

如上代碼所示,調(diào)用bar函數(shù)會報錯,因為參數(shù)x的默認(rèn)值等于另一個參數(shù)y,但是x在聲明的時候y還沒有聲明,屬于死區(qū)。

總之,只要進(jìn)入當(dāng)前作用域,所要使用的變量就已經(jīng)存在,但是不可獲取,只有等到聲明變量的那一行代碼出現(xiàn),才可以獲取和使用該變量。

其實let和const是存在變量提升的,但是由于暫時性死區(qū)的關(guān)系,變量已經(jīng)存在了,但是不可獲取,要等到聲明變量的時候才可以獲取和使用。

不允許重復(fù)聲明

let不允許在校內(nèi)共同作用域內(nèi)重復(fù)聲明同一個變量,這個就不用說了大家都知道。

let a = 1;
let a = 2; // 報錯

const

我們都知道const聲明一個只讀的常量。修改這個值就會報錯。但是實際上保證的不是變量的值不能改動,而是變量指向的那個內(nèi)存地址不能改動。

對于簡單數(shù)據(jù)類型來說,值就是保存在變量指向的內(nèi)存地址中,因此等同于常量。

而對于復(fù)合類型的數(shù)據(jù),變量指向的內(nèi)存地址保存的是一個指針,const只保證指針是固定,不保證內(nèi)部的結(jié)構(gòu)是不是可變的。

    // 給對象添加一個屬性
    const foo = {}
    foo.name = 123
    console.log(foo.name) // 123
    // 將foo指向另一個對象,就會報錯
    foo = {} // 報錯。

如果想要將對象凍結(jié),可以使用Object.freeze

const foo = Object.freeze({});

特性

  • 只在聲明所在的塊級作用域內(nèi)有效。
  • const聲明的常量不會提升,同樣存在暫時性死區(qū),只能在聲明后使用。
  • 不可重復(fù)聲明。

補(bǔ)充——塊級作用域

函數(shù)能不能在塊級作用域中聲明呢?

ES5中是規(guī)定函數(shù)只能在頂級作用域和函數(shù)作用域之中聲明,不能在塊級作用域聲明。

ES6中引入了塊級作用域,明確允許在塊級作用域之中聲明函數(shù)。而且。函數(shù)聲明的語句的行為類似于let,在塊級作用域之外不可引用。

function f() {
    console.log('I am outside!')
}
(function() {
    if(false) {
        function f() {
            console.log('I am inside')
        }
    }
}
f();
}())

上面的代碼,在es5中運(yùn)行時會得到I am inside!,因為if內(nèi)部的f函數(shù)會被提升到函數(shù)頭部。

但是在ES6環(huán)境則會報錯,為什么呢?

因為游覽器的實現(xiàn)有自己的方式:

  • 允許在塊級作用域內(nèi)聲明函數(shù)
  • 函數(shù)聲明類似于var,會提升到全局作用域或函數(shù)作用域的頭部
  • 函數(shù)聲明還會提升到所在的塊級作用域的頭部

所以上述代碼實際在ES6的游覽器中會生成這樣的代碼:

  function f() {
    console.log("I am outside!");
  }
  (function () {
    var f = undefined;
    if (false) {
      function f() {
        console.log("I am inside");
      }
    }
  })();

因此,應(yīng)該避免在塊級作用域內(nèi)聲明函數(shù),如果確定需要寫成函數(shù)表達(dá)式的形式,而不是函數(shù)聲明語句。

到此這篇關(guān)于詳細(xì)解析let和const命令的文章就介紹到這了,更多相關(guān)let和const內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • javascript 對象 與 prototype 原型用法實例分析

    javascript 對象 與 prototype 原型用法實例分析

    這篇文章主要介紹了javascript 對象 與 prototype 原型用法,結(jié)合實例形式分析了javascript 對象 與 prototype 原型實現(xiàn)對象創(chuàng)建、繼承、拷貝等相關(guān)操作技巧,需要的朋友可以參考下
    2019-11-11
  • 詳解webpack打包時排除其中一個css、js文件或單獨(dú)打包一個css、js文件(兩種方法)

    詳解webpack打包時排除其中一個css、js文件或單獨(dú)打包一個css、js文件(兩種方法)

    本文通過兩種方法給大家介紹了webpack打包時排除其中一個css、js文件,或單獨(dú)打包一個css、js文件的方法 ,非常不錯,具有一定的參考借鑒價值,需要的朋友可以參考下
    2018-10-10
  • 前端必備插件之純原生JS的瀑布流插件Macy.js

    前端必備插件之純原生JS的瀑布流插件Macy.js

    這篇文章主要介紹了前端必備插件之純原生JS的瀑布流插件Macy.js,一款非常輕量級的純原生JS的瀑布流插件,有興趣的可以了解一下
    2017-11-11
  • 微信小程序開發(fā)常用功能點(diǎn)與使用方法總結(jié)

    微信小程序開發(fā)常用功能點(diǎn)與使用方法總結(jié)

    最近收集了一些小程序開發(fā)中常用到的知識點(diǎn),記錄一下,所以下面這篇文章主要給大家介紹了關(guān)于微信小程序開發(fā)常用功能點(diǎn)與使用方法的相關(guān)資料,需要的朋友可以參考下
    2021-10-10
  • 詳解JavaScript嚴(yán)格模式的使用方法

    詳解JavaScript嚴(yán)格模式的使用方法

    JavaScript的嚴(yán)格模式(Strict?Mode)是一種在代碼中啟用的特殊模式,用于提供更嚴(yán)格的語法和錯誤檢查,以改善代碼質(zhì)量和增強(qiáng)安全性,本文主要介紹JS的嚴(yán)格模式的用法,可以幫助大家避免一些常見的錯誤,需要的朋友可以參考下
    2023-05-05
  • JS實現(xiàn)禁止鼠標(biāo)右鍵的功能

    JS實現(xiàn)禁止鼠標(biāo)右鍵的功能

    遇到網(wǎng)頁上有精美圖片或者精彩文字想保存時,通常大家都是選中目標(biāo)后按鼠標(biāo)右鍵,在彈出菜單中選擇“圖片另存為”或“復(fù)制”來達(dá)到我們的目的。但是,目前有許多網(wǎng)頁都屏蔽了鼠標(biāo)右鍵,那么用js如何實現(xiàn)禁止鼠標(biāo)右鍵的功能呢?下面小編給大家介紹下
    2016-10-10
  • javascript實現(xiàn)移動端 HTML5 圖片上傳預(yù)覽和壓縮功能示例

    javascript實現(xiàn)移動端 HTML5 圖片上傳預(yù)覽和壓縮功能示例

    這篇文章主要介紹了javascript實現(xiàn)移動端 HTML5 圖片上傳預(yù)覽和壓縮功能,結(jié)合實例形式分析了javascript移動端 HTML5 圖片上傳預(yù)覽和壓縮功能具體實現(xiàn)方法與操作注意事項,需要的朋友可以參考下
    2020-05-05
  • JS中forEach()和map()的區(qū)別講解

    JS中forEach()和map()的區(qū)別講解

    forEach和map方法都是基于數(shù)組的迭代器實現(xiàn)的,它們的主要區(qū)別在于對回調(diào)函數(shù)的處理方式,這篇文章主要介紹了JS中forEach()和map()的區(qū)別,需要的朋友可以參考下
    2024-02-02
  • javascript實現(xiàn)簡單搜索功能

    javascript實現(xiàn)簡單搜索功能

    這篇文章主要為大家詳細(xì)介紹了javascript實現(xiàn)簡單搜索功能,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2020-03-03
  • JS前端基于canvas給圖片添加水印

    JS前端基于canvas給圖片添加水印

    這篇文章主要介紹了JS前端基于canvas給圖片添加水印,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2020-11-11

最新評論

浠水县| 星子县| 淳安县| 吴川市| 广汉市| 南和县| 崇阳县| 卢龙县| 南江县| 临泽县| 洪湖市| 吴川市| 河池市| 精河县| 五家渠市| 溧水县| 乐都县| 临邑县| 和政县| 纳雍县| 渑池县| 新余市| 大兴区| 靖西县| 嘉鱼县| 大石桥市| 永和县| 攀枝花市| 安义县| 芷江| 拜泉县| 高碑店市| 确山县| 比如县| 营口市| 鲁山县| 防城港市| 中西区| 孝昌县| 新郑市| 思南县|