【深入理解ES6】塊級作用域綁定

1. var聲明及變量提升機制

提升(Hoisting)機制:通過關鍵字var聲明的變量,都會被當成在當前作用域頂部生命的變量。

function getValue(condition){if(condition){var value = "blue";console.log(value);}else{// 此處可訪問變量value,其值為undefinedreturn null}// 此處可訪問變量value,其值為undefined
}

JavaScript引擎會將上面的getValue函數修改為下面這樣。變量value的聲明被提升至函數頂部,初始化操作依舊保留在原處執行。為此,ES6引入了塊級作用域來強化對變量聲明周期的控制。

function getValue(condition){var value;if(condition){value = "blue";console.log(value);}else{return null}
}

?

2. 塊級聲明

塊級聲明用于聲明在指定塊的作用域之外無法訪問的變量。

塊級作用域存在于:

  • 函數內部
  • 塊中(‘{}’之間的區域)。

2.1. let聲明

  • 用法同var相同,但聲明不會被提升;
  • 禁止在同一作用域內重聲明;
  • 如果當前作用域內嵌另一個作用域,便可在內嵌的作用域中用let聲明同名變量。
function getValue(condition){if(condition){var value = "blue";console.log(value);}else{// 變量value在此處不存在return null}// 變量value在此處不存在
}
/**禁止重聲明*/var count = 30;
// 拋出語法錯誤
let count = 40;if(condition){// 不會拋出錯誤let count = 40;
}

2.2. const聲明

  • 聲明的是常量,必須初始化;
  • 禁止在同一作用域內重聲明;
  • 不可再賦值(常量對象可修改值;
  • const聲明對象時,不允許修改綁定,但可修改值。
// 有效的常量
const maxItems = 30;
// 語法錯誤,未初始化
const name;if(condition){const cnt = 40;
}
// 在此處無法訪問cntlet age = 20;
// 拋出錯誤,重聲明
const age = 15;const pos = 30;
// 拋出語法錯誤,不能重新賦值
pos = 35;const person = {name: 'Nicholas'
};
// 可以直接修改對象屬性的值
person.name = 'Fleur';
// 直接給person賦值,即要改變person的綁定,會拋出語法錯誤。
person = {name: 'DpprZ'
}

?

3. 臨時死區(Temppral Dead Zone, TDZ)?

由于 console.log(typeof value) 語句會拋出錯誤,因此用 let 定義并初始化變量 value 的語句不會執行。此時的 value 還位于 JavaScript 社區所謂的“臨時死區”。TDZ 通常用來描述 let 和 const 的不提升效果。

if(condition){console.log(typeof value);  // 引用錯誤let value = 40;
}
console.log(typeof value);  // "undefined"
if(condition){let value = 40;
}

?JS引擎掃描代碼發現變量聲明時:

  • var聲明:將他們提升至作用域頂部。
  • let和const聲明:將聲明放在TDZ中。訪問TDZ中的變量會觸發運行時錯誤。只有執行過變睪聲明語句后,變量才會從TDZ中移除,然后方可正常訪問。

?

4. 循環中的塊級作用域綁定

for循環中通過let將計數器變量限制在循環內部。

for(var i = 0; i < 10; i++){// 更多代碼
}
// 在這里仍然可以訪問變量i
console.log(i); // 10for(let i = 0; i < 10; i++){// 更多代碼
}
// i在這里不可訪問,拋出錯誤
console.log(i); 

?

5. 循環中的函數、let聲明、const聲明

let funcs = [];
for(var i = 0; i < 10; i++){funcs.push(function(){console.log(i)})
}
/*
每個funcs[]中都存在一個函數:? (){ console.log(i) }
*/
funcs.forEach(function(func){func(); // 10個10
})

因為這里的循環里的每次迭代同時共享著變量i,循環內部創建的函數都保留了對相同變量的引用。
解決該問題的兩種方案:

在循環中使用立即調用函數表達式(IIFE),以強制生成計數器變量的副本。

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

用let聲明計數器:每次迭代循環都會創建一個新變量 i,并以之前迭代同名變量的值將其初始化。所以循環內部創建的每一個函數都能夠得到屬于自己的 i 的值。let 聲明在循環內部的行為是標準中專門定義的,它不一定與let的不提升特性相關,理解這一點至關重要!

let funcs = [];for(let i = 0; i < 10; i++){funcs.push(function(){console.log(i)})
}funcs.forEach(function(func){func(); // 0 1 2 3...... 9
})
  • ?let聲明:聲明計數器、for-in、for-of
  • const聲明:生命循環內不改變的值、for-in、for-of

?

6. 全局塊作用域綁定

var、let、const在全局作用域中的行為區別:

var會創建一個新的變量作為全局對象(瀏覽器環境中的window對象),會無意中覆蓋已存在的全局屬性。

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

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/40920.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/40920.shtml
英文地址,請注明出處:http://en.pswp.cn/news/40920.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

代碼隨想錄算法訓練營第三十六天 | 435. 無重疊區間,763.劃分字母區間,56. 合并區間

代碼隨想錄算法訓練營第三十六天 | 435. 無重疊區間&#xff0c;763.劃分字母區間&#xff0c;56. 合并區間 435. 無重疊區間:eyes:題目總結:eyes: 763.劃分字母區間:eyes:題目總結:eyes: 56. 合并區間:eyes:題目總結:eyes: 435. 無重疊區間 題目鏈接 視頻講解 給定一個區間的…

并發編程系列-Semaphore

Semaphore&#xff0c;如今通常被翻譯為"信號量"&#xff0c;過去也曾被翻譯為"信號燈"&#xff0c;因為類似于現實生活中的紅綠燈&#xff0c;車輛是否能通行取決于是否是綠燈。同樣&#xff0c;在編程世界中&#xff0c;線程是否能執行取決于信號量是否允…

8.10 用redis實現緩存功能和Spring Cache

什么是緩存? 緩存(Cache), 就是數據交換的緩沖區,俗稱的緩存就是緩沖區內的數據,一般從數據庫中獲取,存儲于本地代碼。 通過Redis來緩存數據&#xff0c;減少數據庫查詢操作; 邏輯 每個分類的菜品保存一份緩存數據 數據庫菜品數據有變更時清理緩存數據 如何將商品數據緩存起…

p-級數的上界(Upper bound of p-series)

積分判別法-The Integral Test https://math.stackexchange.com/questions/2858067/upper-bound-of-p-series https://courses.lumenlearning.com/calculus2/chapter/the-p-series-and-estimating-series-value/ 兩個重要級數&#xff08;p級數和幾何級數&#xff09; ht…

WPF顯示初始界面--SplashScreen

WPF顯示初始界面–SplashScreen 前言 WPF應用程序的運行速度快&#xff0c;但并不能在瞬間啟動。當第一次啟動應用程序時&#xff0c;會有一些延遲&#xff0c;因為公共語言運行時&#xff08;CLR&#xff09;首先需要初始化.NET環境&#xff0c;然后啟動應用程序。 對于WPF中…

高憶管理:股票T+0交易是什么意思?t+0交易有什么好處?

股票的買賣準則有很多種&#xff0c;T0買賣便是其中之一。那么股票T0買賣是什么意思&#xff1f;t0買賣有什么優點&#xff1f;高憶管理也為大家預備了相關內容&#xff0c;以供參考。 股票T0買賣是什么意思&#xff1f; T0買賣準則是指出資者當天買入的股票能夠在當天賣出&am…

IP 多播協議(IP Multicast Protocol)

IP 多播協議&#xff08;IP Multicast Protocol&#xff09;是一種在網絡中一對多傳輸數據的通信方式。在傳統的單播通信中&#xff0c;數據從一個發送方發送到一個接收方&#xff1b;而在多播通信中&#xff0c;數據可以從一個發送方傳輸到多個接收方&#xff0c;從而有效地節…

SpringBoot 異步、郵件任務

異步任務 創建一個Hello項目 創建一個類AsyncService 異步處理還是非常常用的&#xff0c;比如我們在網站上發送郵件&#xff0c;后臺會去發送郵件&#xff0c;此時前臺會造成響應不動&#xff0c;直到郵件發送完畢&#xff0c;響應才會成功&#xff0c;所以我們一般會采用多線…

神經網絡基礎-神經網絡補充概念-03-邏輯回歸損失函數

概念 邏輯回歸使用的損失函數通常是"對數損失"&#xff08;也稱為"交叉熵損失"&#xff09;或"邏輯損失"。這些損失函數在訓練過程中用于衡量模型預測與實際標簽之間的差異&#xff0c;從而幫助模型逐步調整權重參數&#xff0c;以更好地擬合數…

指靜脈開集測試(OpenSet-test)代碼(包含7個數據集)

七個數據集:sdu、mmc、hkpu、scut、utfvp、vera、nupt 一、SDU 80%用于訓練,20%用于作為開集測試 1.數據集分割代碼 ①先把636個類別提取出來 func: 創建temp_sdu,將636個類劃分出來。下一個代碼塊將進行openset_sdu的分割import os from shutil import copy, rmtre…

c++--SLT六大組件之間的關系

1.SLT六大組件&#xff1a; 容器&#xff0c;迭代器&#xff0c;算法&#xff0c;仿函數&#xff0c;適配器&#xff0c;空間配置器 2.六大組件之間的關系 容器&#xff1a;容器是STL最基礎的組件&#xff0c;沒有容器&#xff0c;就沒有數據&#xff0c;容器的作用就是用來存…

IO流 詳細介紹

一、IO流概述 1.IO&#xff1a;輸入(Input讀取數據)/輸出(Output寫數據) 2.流&#xff1a;是一種抽象概念&#xff0c;是對數據傳輸的總稱,也就是說數據在設備間的傳輸稱為流&#xff0c;流的本質是數據傳輸IO流就是用來處理設備間數據傳輸問題的。 3.常見的應用&#xff1a…

【Sklearn】基于隨機森林算法的數據分類預測(Excel可直接替換數據)

【Sklearn】基于隨機森林算法的數據分類預測(Excel可直接替換數據) 1.模型原理1.1 模型原理1.2 數學模型2.模型參數3.文件結構4.Excel數據5.下載地址6.完整代碼7.運行結果1.模型原理 隨機森林(Random Forest)是一種集成學習方法,通過組合多個決策樹來構建強大的分類或回歸…

JVM - 垃圾回收機制

JVM的垃圾回收機制(簡稱GC) JVM的垃圾回收機制非常強大&#xff0c;是JVM的一個很重要的功能&#xff0c;而且這也是跟對象實例息息相關的&#xff0c;如果對象實例不用了要怎么清除呢&#xff1f; 如何判斷對象已經沒用了 當JVM認為一個對像已經沒用了&#xff0c;就會把這個…

初識Sentinel

目錄 1.解決雪崩的方式有4種&#xff1a; 1.1.2超時處理&#xff1a; 1.1.3倉壁模式 1.1.4.斷路器 1.1.5.限流 1.1.6.總結 1.2.服務保護技術對比 1.3.Sentinel介紹和安裝 1.3.1.初識Sentinel 1.3.2.安裝Sentinel 1.4.微服務整合Sentinel 2.流量控制 2.1.簇點鏈路 …

Ubuntu中怎么清空mysql數據

要清空 MySQL 數據&#xff0c;可以使用以下步驟來執行。請注意&#xff0c;這將會永久刪除數據庫中的所有數據&#xff0c;請謹慎操作&#xff0c;并在操作前備份重要數據。 登錄 MySQL&#xff1a; 打開終端&#xff0c;使用以下命令登錄到 MySQL 數據庫。根據情況&#xf…

黑馬項目一階段面試58題 Web14題(一)

一、什么是AJAX 異步的JavaScript和XML。用來做前端和后端的異步請求的技術。 異步請求&#xff1a;只更新部分前端界面的請求&#xff0c;做到局部更新。 比如注冊&#xff0c;提示用戶名已存在而整個頁面沒有動 比如百度圖片搜索美女&#xff0c;進度條越變越短&#xff…

== 和 equals 的對比 [面試題]

和 equals 的對比[面試題] 文章目錄 和 equals 的對比[面試題]1. 和 equals 簡介2. Object 類中 equals() 源碼3. String 類中 equals() 源碼4. Integer 類中 equals() 源碼5. 如何重寫 equals 方法 1. 和 equals 簡介 是一個比較運算符 &#xff1a;既可以判斷基本數據類型…

【數據結構OJ題】鏈表的回文結構

原題鏈接&#xff1a;https://www.nowcoder.com/practice/d281619e4b3e4a60a2cc66ea32855bfa?tpId49&&tqId29370&rp1&ru/activity/oj&qru/ta/2016test/question-ranking 目錄 1. 題目描述 2. 思路分析 3. 代碼實現 1. 題目描述 2. 思路分析 在做這道…

re中的match和search有什么區別?

問題:請說明以下re模塊中的match和search有什么區別? re.match()與re.search()的區別 re.match()只匹配字符串的開始,如果字符串開始不符合正則表達式,則匹配失敗,結果返回None,而re.search()匹配整個字符串,直到找到一個匹配 re.search() re.search()掃描整個字符串并…