亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

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

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

let命令

基本用法

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

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

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

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

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

這是因?yàn)镴avaScript引擎內(nèi)部會(huì)記住上一輪循環(huán)的值,初始化當(dāng)次循環(huán)的i時(shí),會(huì)在上一輪循環(huán)的基礎(chǔ)上計(jì)算。

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

特性

不存在變量提升:

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

所以。let命令改變了這種語(yǔ)法,通過(guò)let聲明的變量一定要在變量聲明后才能用,不然就會(huì)報(bào)錯(cuò)。

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

暫時(shí)性死區(qū)

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

var num = 1;
if(true) {
    num = 2; // 報(bào)錯(cuò),ReferenceError
    let num;
}

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

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

當(dāng)然,這也造成了typeof變得不安全了,因?yàn)槿绻粋€(gè)變量沒(méi)有聲明就使用typeof不會(huì)報(bào)錯(cuò),會(huì)返回一個(gè)undefined,但是現(xiàn)在不成立了,因?yàn)闀?huì)報(bào)錯(cuò)ReferenceError。

function bar(x = y, y = 2) {
    return[x,y] 
}
bar() // 報(bào)錯(cuò)

如上代碼所示,調(diào)用bar函數(shù)會(huì)報(bào)錯(cuò),因?yàn)閰?shù)x的默認(rèn)值等于另一個(gè)參數(shù)y,但是x在聲明的時(shí)候y還沒(méi)有聲明,屬于死區(qū)

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

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

不允許重復(fù)聲明

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

let a = 1;
let a = 2; // 報(bào)錯(cuò)

const

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

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

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

    // 給對(duì)象添加一個(gè)屬性
    const foo = {}
    foo.name = 123
    console.log(foo.name) // 123
    // 將foo指向另一個(gè)對(duì)象,就會(huì)報(bào)錯(cuò)
    foo = {} // 報(bào)錯(cuò)。

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

const foo = Object.freeze({});

特性

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

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

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

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

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

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

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

但是在ES6環(huán)境則會(huì)報(bào)錯(cuò),為什么呢?

因?yàn)橛斡[器的實(shí)現(xiàn)有自己的方式:

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

所以上述代碼實(shí)際在ES6的游覽器中會(huì)生成這樣的代碼:

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

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

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

相關(guān)文章

  • javascript中l(wèi)ength屬性的探索

    javascript中l(wèi)ength屬性的探索

    本文中,我將會(huì)通過(guò)類(lèi)數(shù)組對(duì)象(array like object),探索javascript中的length屬性的一些秘密。
    2011-07-07
  • Javascript中Cookie的獲取和保存應(yīng)用案例

    Javascript中Cookie的獲取和保存應(yīng)用案例

    這篇文章主要給大家介紹了關(guān)于Javascript中Cookie的獲取和保存應(yīng)用的相關(guān)資料,Cookie是直接存儲(chǔ)在瀏覽器中的一小串?dāng)?shù)據(jù),文中通過(guò)圖文介紹的非常詳細(xì),需要的朋友可以參考下
    2023-09-09
  • 改版了網(wǎng)上的一個(gè)js操作userdata

    改版了網(wǎng)上的一個(gè)js操作userdata

    改版了網(wǎng)上的一個(gè)js操作userdata,并根據(jù)其它網(wǎng)友的文章結(jié)合了下。希望對(duì)需要的朋友有所幫助。
    2007-04-04
  • Javascript?原型與原型鏈深入詳解

    Javascript?原型與原型鏈深入詳解

    這篇文章主要介紹了Javascript原型與原型鏈深入詳解,文章圍繞主題展開(kāi)詳細(xì)的內(nèi)容介紹,具有一定的參考價(jià)值,需要的朋友可以參考一下
    2022-07-07
  • OpenLayer3自定義測(cè)量控件MeasureTool

    OpenLayer3自定義測(cè)量控件MeasureTool

    這篇文章主要為大家詳細(xì)介紹了OpenLayer3自定義測(cè)量控件MeasureTool,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2020-09-09
  • 原生JS實(shí)現(xiàn)平滑回到頂部組件

    原生JS實(shí)現(xiàn)平滑回到頂部組件

    返回頂部組件是一種極其常見(jiàn)的網(wǎng)頁(yè)功能,需求簡(jiǎn)單:頁(yè)面滾動(dòng)一定距離后,顯示返回頂部的按鈕,點(diǎn)擊該按鈕可以將滾動(dòng)條滾回至頁(yè)面開(kāi)始的位置,接下來(lái)通過(guò)本文給大家介紹原生JS實(shí)現(xiàn)平滑回到頂部組件,需要的朋友參考下吧
    2016-03-03
  • JavaScript中自帶的 reduce()方法使用示例詳解

    JavaScript中自帶的 reduce()方法使用示例詳解

    下文小編給大家?guī)?lái)了js中自帶的reduce()方法使用示例詳解,非常不錯(cuò),具有參考借鑒價(jià)值,感興趣的朋友一起學(xué)習(xí)吧
    2016-08-08
  • 一文吃透JS樹(shù)狀結(jié)構(gòu)的數(shù)據(jù)處理(增刪改查)

    一文吃透JS樹(shù)狀結(jié)構(gòu)的數(shù)據(jù)處理(增刪改查)

    在開(kāi)發(fā)后臺(tái)管理系統(tǒng)時(shí),常常會(huì)涉及到各種樹(shù)狀結(jié)構(gòu)的數(shù)據(jù)處理邏輯,例如:增,刪,改,查等。而樹(shù)狀結(jié)構(gòu)的處理就沒(méi)有數(shù)組那么的直觀(guān)。本文為大家總結(jié)了JS樹(shù)狀結(jié)構(gòu)的數(shù)據(jù)處理的方法,需要的可以參考下
    2022-07-07
  • JavaScript中的 new 命令

    JavaScript中的 new 命令

    這篇文章主要介紹了JavaScript中的new 命令,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2019-05-05
  • 在DWR中實(shí)現(xiàn)直接獲取一個(gè)JAVA類(lèi)的返回值的兩種方法

    在DWR中實(shí)現(xiàn)直接獲取一個(gè)JAVA類(lèi)的返回值的兩種方法

    本文主要介紹了在DWR中實(shí)現(xiàn)直接獲取一個(gè)JAVA類(lèi)的返回值的兩種方法,具有一定的參考價(jià)值,下面跟著小編一起來(lái)看下吧
    2016-12-12

最新評(píng)論