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

深入理解ES6學(xué)習(xí)筆記之塊級(jí)作用域綁定

 更新時(shí)間:2017年08月19日 17:48:26   作者:angelayun  
本篇文章主要介紹了深入理解ES6學(xué)習(xí)筆記之塊級(jí)作用域綁定,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下

眾所周知,js中的var聲明存在變量提升機(jī)制,因此ESMAScript 6引用了塊級(jí)作用域來強(qiáng)化對(duì)變量生命周期的控制
let const 聲明不會(huì)被提升,有幾個(gè)需要注意的點(diǎn)

1、不能被重復(fù)聲明

假設(shè)作用域中已經(jīng)存在某個(gè)標(biāo)識(shí)符(無論該標(biāo)識(shí)符是通過var聲明還是let、const變量聲明),此時(shí)再使用let或const關(guān)鍵定聲明會(huì)拋錯(cuò)

var count=10
let count=20// 此處則會(huì)拋出錯(cuò)誤,因?yàn)橥蛔饔糜騼?nèi)不能重復(fù)聲明

如果當(dāng)前作用域內(nèi)嵌另一個(gè)作用域,便可在內(nèi)嵌的作用域中用let聲明同名變量

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

2、const聲明的常量必須進(jìn)行初始化

像下面這樣聲明就會(huì)報(bào)錯(cuò)

const name;//語(yǔ)法錯(cuò)誤,常量未初始化

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

const person={
 name:'angela'
}
//可以修改對(duì)象屬性的值
person.name='yun'
// 修改綁定則會(huì)拋出語(yǔ)法錯(cuò)誤
person={
 'name':'Shining'
}

4、臨時(shí)性死區(qū)(Temporal Dead Zone)

JavaScript引擎在掃描代碼發(fā)現(xiàn)變量聲明時(shí),要么將它們提升至作用域頂部(遇到var聲明),要么將聲明放到TDZ中(遇到let和const聲明),訪問TDZ中的變量會(huì)觸發(fā)運(yùn)行時(shí)錯(cuò)誤,只有執(zhí)行過變量聲明語(yǔ)句后,變量才會(huì)從TDZ中移出,才能正常訪問
如下代碼就因?yàn)樵趇f塊級(jí)作用域內(nèi)執(zhí)行console.log時(shí)value已經(jīng)在TDZ中了,以前typeof是一個(gè)相對(duì)不易出錯(cuò)的操作符,但其實(shí)也無法阻擋引擎拋出錯(cuò)誤

在聲明前訪問塊級(jí)綁定會(huì)導(dǎo)致錯(cuò)誤,因?yàn)榻壎ㄔ谂R時(shí)死區(qū)中

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

而在let聲明的作用域外對(duì)該變量使用typeof則不會(huì)報(bào)錯(cuò)

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

5、塊級(jí)作用域綁定

之前在循環(huán)中創(chuàng)建函數(shù)都有些不可言狀

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

因?yàn)檠h(huán)內(nèi)部創(chuàng)建的函數(shù)全部都保留了對(duì)相同變量的引用,循環(huán)結(jié)束時(shí)變量i的值為10,所以結(jié)果會(huì)輸出10次10

于是大家會(huì)在循環(huán)中使用立即調(diào)用函數(shù)表達(dá)式,以強(qiáng)制生成計(jì)數(shù)器變量的副本,以便輸出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,立即調(diào)用函數(shù)表達(dá)式則可以簡(jiǎn)化,其實(shí)每次迭代循環(huán)都會(huì)創(chuàng)建一個(gè)新變量,并以之前迭代中同名變量的值將其初始化

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

這個(gè)特性同樣適用于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、循環(huán)中的let聲明特性同樣適用于const聲明,唯一的區(qū)別是const不能更改綁定

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

var funcs = [],
 obj = {
  a: true,
  b: true,
  c: true
 }
//之所以可以運(yùn)用for in 和for of循環(huán)中,是因?yàn)槊看蔚粫?huì)修改已有綁定,而是會(huì)創(chuàng)建一個(gè)新綁定
for (const key in obj) {
 funcs.push(function () {
  console.log(key)// 同樣輸出a b c 唯一的區(qū)別是循環(huán)內(nèi)不能更改key的值
 })
}
funcs.forEach(function (func) {
 func()
})

下面的這個(gè)例子則會(huì)報(bào)錯(cuò),因?yàn)樵趂or循環(huán)中更改了i的綁定而const常量不能更改綁定

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

7、全局作用域綁定

當(dāng)var被作用于全局作用域時(shí),它會(huì)創(chuàng)建一個(gè)新的全局變量作用全局對(duì)象(瀏覽器環(huán)境中的window對(duì)象)的屬性,這意味著用var很可能會(huì)無意中覆蓋一個(gè)已經(jīng)存在的全局變量

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

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

這個(gè)時(shí)候的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)

最佳實(shí)踐:

默認(rèn)使用let而不是var

默認(rèn)使用const,只有確實(shí)需要改變變量的值時(shí)使用let

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

相關(guān)文章

  • 微信小程序wxss如何引用外部CSS文件以及iconfont

    微信小程序wxss如何引用外部CSS文件以及iconfont

    這篇文章主要給大家介紹了關(guān)于微信小程序wxss如何引用外部CSS文件以及iconfont的相關(guān)資料,文中通過圖文介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-03-03
  • Chrome擴(kuò)展頁(yè)面動(dòng)態(tài)綁定JS事件提示錯(cuò)誤

    Chrome擴(kuò)展頁(yè)面動(dòng)態(tài)綁定JS事件提示錯(cuò)誤

    開發(fā)Chrome擴(kuò)展時(shí),頁(yè)面的popup.html中需要js的時(shí)候,直接將JS寫在動(dòng)態(tài)綁定JS事件會(huì)提示錯(cuò)誤,下面有個(gè)不錯(cuò)的解決方法,大家可以參考下
    2014-02-02
  • JavaScript必看的10道面試題總結(jié)(推薦)

    JavaScript必看的10道面試題總結(jié)(推薦)

    JavaScript 已經(jīng)成為全棧開發(fā)技能的基石,在全棧開發(fā)面試中都會(huì)不可避免地涉及到與 JavaScript 有關(guān)的問題。這篇文章主要給大家介紹了關(guān)于JavaScript必看的10道面試題,需要的朋友可以參考下
    2021-05-05
  • TypeScript 中如何限制對(duì)象鍵名的取值范圍

    TypeScript 中如何限制對(duì)象鍵名的取值范圍

    TypeScript由微軟開發(fā)的自由和開源的編程語(yǔ)言,是一種給 JavaScript 添加特性的語(yǔ)言擴(kuò)展,接下來通過本文給大家介紹TypeScript 中如何限制對(duì)象鍵名的取值范圍,感興趣的朋友跟隨小編一起看看吧
    2021-05-05
  • JavaScript新引入的原始數(shù)據(jù)類型Symbol詳解

    JavaScript新引入的原始數(shù)據(jù)類型Symbol詳解

    Symbol是ES6中引入的一種新的基本數(shù)據(jù)類型,用于表示一個(gè)獨(dú)一無二的值。它是JavaScript中的第七種數(shù)據(jù)類型。本文將詳細(xì)講講Symbol的使用,需要的可以參考一下
    2023-01-01
  • js點(diǎn)擊文本框后才加載驗(yàn)證碼實(shí)例代碼

    js點(diǎn)擊文本框后才加載驗(yàn)證碼實(shí)例代碼

    這篇文章是一段關(guān)于js點(diǎn)擊文本框后才加載驗(yàn)證碼實(shí)例代碼,而不是直接顯示驗(yàn)證碼,感興趣的小伙伴們可以參考一下
    2015-10-10
  • 將字符串轉(zhuǎn)換成gb2312或者utf-8編碼的參數(shù)(js版)

    將字符串轉(zhuǎn)換成gb2312或者utf-8編碼的參數(shù)(js版)

    直接在url中傳遞中文參數(shù)時(shí),讀到的中文都是亂碼,那么我們應(yīng)該怎么將這些參數(shù)轉(zhuǎn)換呢,接下來與大家分享下將字符串轉(zhuǎn)換成utf-8或者gb2312編碼的參數(shù)的技巧
    2013-04-04
  • H5用戶注冊(cè)表單頁(yè) 注冊(cè)模態(tài)框!

    H5用戶注冊(cè)表單頁(yè) 注冊(cè)模態(tài)框!

    這篇文章主要為大家詳細(xì)介紹了H5用戶注冊(cè)表單頁(yè)的相關(guān)代碼,注冊(cè)模態(tài)框,如何設(shè)計(jì)用戶注冊(cè)表單頁(yè),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2016-09-09
  • JavaScript中的this關(guān)鍵字用法詳解

    JavaScript中的this關(guān)鍵字用法詳解

    在編寫JavaScript應(yīng)用的時(shí)候,我們經(jīng)常會(huì)使用this關(guān)鍵字。那么this關(guān)鍵字究竟是怎樣工作的,它的設(shè)計(jì)有哪些好的地方,有哪些不好的地方,本文帶大家全面系統(tǒng)地認(rèn)識(shí)這個(gè)老朋友,感興趣的小伙伴可以借鑒閱讀
    2023-05-05
  • javascript在線編碼查詢工具

    javascript在線編碼查詢工具

    在線編碼查詢工具,編碼查詢,HTML編碼
    2010-10-10

最新評(píng)論

桃园县| 罗源县| 巩留县| 根河市| 宁安市| 灌南县| 柏乡县| 张北县| 凤翔县| 丁青县| 广东省| 新郑市| 河曲县| 饶平县| 启东市| 马关县| 林州市| 抚远县| 开远市| 孙吴县| 盐边县| 庐江县| 密云县| 钦州市| 冀州市| 凤凰县| 温宿县| 珲春市| 禄劝| 唐河县| 台东县| 玉门市| 万全县| 界首市| 河池市| 上林县| 吐鲁番市| 崇仁县| 体育| 乐陵市| 黔西县|