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

詳解ES6之用let聲明變量以及l(fā)et loop機(jī)制

 更新時間:2017年07月15日 14:58:20   作者:還有將來  
本篇文章主要介紹了詳解ES6之用let聲明變量以及l(fā)et loop機(jī)制,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧

在上一篇對js閉包的理解那篇文章中,我提到過ES6之前,JavaScript這門語言沒有塊級作用域,但是在ES6中,加入了let命令,用let聲明的變量僅僅可以在其所在的塊級作用域中使用。

相比用var聲明,let聲明的特點(diǎn)

1.let聲明的變量僅在該變量所在的作用域有效

for(let i=0;i<5;i++){} console.log(i); //報(bào)錯
for(var i=0;i<5;i++){} console.log(i); //i=5;

2.不存在變量提升

先解釋下變量提升:變量提升就是變量聲明語句都會被提到所在作用域開始處,就是經(jīng)過變量提升后,代碼的實(shí)際執(zhí)行順序會與你所寫的順序不同。

console.log(i);
var i=2;

因?yàn)樽兞刻嵘?,所以上述代碼不會報(bào)錯,只會輸出undefined。

但是要注意:變量提升只是提升聲明語句,而不提升賦值語句

所以上述語句經(jīng)過提升之后,實(shí)際的代碼執(zhí)行順序是

var i;
console.log(i);
i=2;

再來看道經(jīng)典試題

var name = 'World!'; 
(function () { 
if (typeof name === 'undefined') { 
  var name = 'Jack'; 
  console.log('Goodbye ' + name); 
}else{ 
  console.log('Hello ' + name); 
} 
})();

請問最終console的結(jié)果是什么?

如果對變量提升一無所知,會很容易的得出hello world的結(jié)果。

我對變量提升略知一二,得出的結(jié)果是hello Jack.

但是正確結(jié)果是Goodbye Jack. 做錯的原因就是我沒有注意到變量提升僅僅是聲明提升。

3.不可以在同一作用域內(nèi)重復(fù)聲明

function temp(){
   let a;
   let b; 
} //報(bào)錯

4.暫時性死區(qū)

var tmp="123"; 
if(true){ 
 tmp="abc";
 let tmp;
}

定義(出自ES6標(biāo)準(zhǔn)入門一書):在代碼塊內(nèi),使用let變量聲明之前,該變量是不可以用的。這在語法上稱為暫時性死區(qū)。

但是如果去掉上述let tmp;這句,代碼是不會錯的,只是這時的tmp即外部的全局變量,但是你如果要聲明一個與外部變量同名的局部變量,那么你就要放在這個同名變量使用之前,否則就會報(bào)錯。

說一說(let i=0;i<5;i++)的運(yùn)行機(jī)制

不好意思,我們還得拿閉包來說事。

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

然后,結(jié)果i并非我們想象得那樣,按照0,1,2...的順序打印,而都是打印5,在上一篇文章理解js閉包中,我們已經(jīng)知道如何用閉包解決這個問題。但是呢,這還有一種更簡單的解法,如下

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

對,就是這么簡單,用一個let代替var,就搞定了。但是為什么呢?說實(shí)話,閉包我能想得通,但是用let真心想不通為什么可以解決這個問題。問過一些人,但是他們只是很糊弄得說,let是塊級作用域。我覺得他們壓根就沒有搞懂,我覺得這里絕對有蹊蹺,僅僅憑let是塊級作用域并不能解釋的通,一定有其他機(jī)制。

我的疑惑:就算let是塊級作用域,可是在函數(shù)里,我們沒有定義新的i,所以你訪問i,其實(shí)都在訪問父級作用域,對 let i=0;使得i只能在for循環(huán)的{}內(nèi)使用,但是當(dāng)你調(diào)用ai的時候,不管i是多少,它們都應(yīng)該是訪問的是同一個i,怎么會出現(xiàn)0,1,2,3,4呢?
百度一下,果然不出我所料,阮一峰大神給出的解釋是,對每一次循環(huán),都是產(chǎn)生不同的i,所以5次循環(huán),產(chǎn)生了5個塊級作用域,而不同的塊級作用域間實(shí)現(xiàn)i++是通過js引擎記住上一個i值實(shí)現(xiàn)的。這樣一來,ai調(diào)用時,就會訪問到與自己對應(yīng)的i,而不是同一個i.

所以,let可以得到閉包的效果是因?yàn)閘et具有塊級作用域,與let loop特殊的機(jī)制。

起初,我對這個結(jié)果不太相信,因?yàn)楹椭庇X不太相符,感覺5次循環(huán),產(chǎn)生5個i,和自己以前的認(rèn)知不大相同啊。然后我有有了新的發(fā)現(xiàn)

第一個發(fā)現(xiàn):

for(let i=0;i<5;i++){
   let i="abc";
   console.log(i);
}

我吃驚的是竟然沒有報(bào)錯!說好的let不可以重復(fù)聲明呢?這充分證明了let i=0;與let i="abc"不在同一個作用域。

第二個發(fā)現(xiàn):可以通過babel將ES6代碼轉(zhuǎn)為ES5,看看上述代碼是如何實(shí)現(xiàn)的?


先創(chuàng)建一個loop函數(shù),最終在循環(huán)的時候調(diào)用loop函數(shù)并將i作為參數(shù)傳入,這樣便會形成5個不同的副本。這也證明了用let代替閉包,關(guān)鍵是形成了5個不同的塊級作用域。

最后,ES6只是一種規(guī)范,比如說let的規(guī)范,但實(shí)現(xiàn)該規(guī)范的是JS引擎,如babel對上述代碼的轉(zhuǎn)換便體現(xiàn)出了babel對let loop的實(shí)現(xiàn)。

以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • Bootstrap popover用法詳解

    Bootstrap popover用法詳解

    這篇文章主要為大家詳細(xì)介紹了Boostrap popover用法,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2016-12-12
  • webpack4 入門最簡單的例子介紹

    webpack4 入門最簡單的例子介紹

    這篇文章主要介紹了webpack4 入門最簡單的例子介紹,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-09-09
  • Javascript異步流程控制之串行執(zhí)行詳解

    Javascript異步流程控制之串行執(zhí)行詳解

    這篇文章主要給大家介紹了關(guān)于Javascript異步流程控制之串行執(zhí)行的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-09-09
  • 微信小程序?qū)崿F(xiàn)電子簽名并導(dǎo)出圖片

    微信小程序?qū)崿F(xiàn)電子簽名并導(dǎo)出圖片

    這篇文章主要為大家詳細(xì)介紹了微信小程序?qū)崿F(xiàn)電子簽名,并導(dǎo)出圖片,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2020-05-05
  • js實(shí)現(xiàn)仿百度汽車頻道選擇汽車圖片展示實(shí)例

    js實(shí)現(xiàn)仿百度汽車頻道選擇汽車圖片展示實(shí)例

    這篇文章主要介紹了js實(shí)現(xiàn)仿百度汽車頻道選擇汽車圖片展示,實(shí)例分析了javascript鼠標(biāo)事件操作css樣式的技巧,非常具有實(shí)用價值,需要的朋友可以參考下
    2015-05-05
  • 小程序?qū)崿F(xiàn)錄音上傳功能

    小程序?qū)崿F(xiàn)錄音上傳功能

    這篇文章主要為大家詳細(xì)介紹了小程序?qū)崿F(xiàn)錄音上傳功能,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2019-11-11
  • JS是按值傳遞還是按引用傳遞

    JS是按值傳遞還是按引用傳遞

    在分析這個問題之前,我們需了解什么是按值傳遞(call by value),什么是按引用傳遞(call by reference)。在計(jì)算機(jī)科學(xué)里,這個部分叫求值策略(Evaluation Strategy)。它決定變量之間、函數(shù)調(diào)用時實(shí)參和形參之間值是如何傳遞的。
    2015-01-01
  • Bootstrap CSS組件之輸入框組

    Bootstrap CSS組件之輸入框組

    這篇文章主要為大家詳細(xì)介紹了Bootstrap CSS組件之輸入框組(input-group),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2016-12-12
  • 簡單的兩種Extjs formpanel加載數(shù)據(jù)的方式

    簡單的兩種Extjs formpanel加載數(shù)據(jù)的方式

    這篇文章介紹了兩種Extjs formpanel加載數(shù)據(jù)的方式,有需要的朋友可以參考一下
    2013-11-11
  • 微信小程序頁面生命周期詳解

    微信小程序頁面生命周期詳解

    這篇文章主要為大家詳細(xì)介紹了微信小程序頁面生命周期的相關(guān)資料,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-01-01

最新評論

麟游县| 宜丰县| 建水县| 淮安市| 琼海市| 陆良县| 五家渠市| 乐至县| 遂溪县| 武威市| 运城市| 邳州市| 那坡县| 荥经县| 许昌县| 海门市| 科技| 凤冈县| 贵州省| 新乡县| 达拉特旗| 平山县| 平南县| 杭锦旗| 桑日县| 贵阳市| 庄河市| 陇川县| 鄂托克旗| 江北区| 石台县| 天气| 大冶市| 鄂尔多斯市| 太谷县| 南宁市| 安图县| 息烽县| 白水县| 沧州市| 富裕县|