深入理解ES6之—塊級綁定

来源:http://www.cnblogs.com/xzsty/archive/2017/10/30/7753207.html
-Advertisement-
Play Games

var聲明與變數提升 使用var關鍵字聲明的變數,無論其實際聲明位置在何處,都會被視為聲明於所在函數的頂部(如果聲明不在任意函數內,則視為在全局作用域的頂部)。這就是所謂的變數提升。 塊級聲明 塊級聲明就是讓所聲明的變數在指定塊的作用域外無法被訪問。塊級作用域在如下情況被創建: 1. 一個函數內部 ...


var聲明與變數提升

使用var關鍵字聲明的變數,無論其實際聲明位置在何處,都會被視為聲明於所在函數的頂部(如果聲明不在任意函數內,則視為在全局作用域的頂部)。這就是所謂的變數提升。

塊級聲明

塊級聲明就是讓所聲明的變數在指定塊的作用域外無法被訪問。塊級作用域在如下情況被創建:

  1. 一個函數內部
  2. 在一個代碼塊內部

let聲明

let聲明的語法和var的語法一致。基本可以使用let替換var,但會將變數的作用域限制在當前代碼塊中。let聲明不會被提升到當前代碼塊的頂部。

禁止重覆聲明

如果一個標識符在代碼內部被定義,那麼在此代碼塊內部使用同一個標識符進行let聲明就會導致拋出錯誤。

var count = 30;
let count = 40;//語法錯誤

如果在嵌套作用域內使用let聲明一個同名的新變數,則不會拋出錯誤。

var count = 30;
if(condition){
    let count = 40;//不會拋出錯誤
}

常量聲明

使用const進行常量的聲明,它們的值在被設置完成之後就不能再被改變。正因為如此,所有的const變數都需要在聲明時進行初始化

const MAX_ITEMS = 30;
const NAME;//語法錯誤

常量與let聲明都是塊級聲明。與let聲明類似,const聲明會在同一作用域內定義一個已有變數時會刨除錯誤,無論改變了是var聲明還是let聲明。

var message = "HELLO";
let age = 25;

//二者都會拋出錯誤
const message = "Goodbye";
const age = 23;

let與const一個重大區別是:試圖對之前用const聲明的常量進行賦值會拋出錯誤,無論在嚴格模式還是非嚴格模式下

const maxItems = 30;
maxItems = 35;//拋出錯誤

但是如果const定義的常量如果是一個對象,它所包含的值是可以修改的。

var const person = {
    name = "cc"
}

//正常工作
person.name = "dd";

//拋出錯誤
person = {
    name = "aa";
}

全局塊級綁定

let和const不同於var的另一個方面是在全局作用域上的表現。當在全局作用域上使用var時,它會創建一個新的全局變數,併成為全局對象(在瀏覽器中是window)的一個屬性。這意味著使用var可能會無意覆蓋一個已有的全局屬性。

var RegExp = "hello";
console.log(window.RegExp);//"hello"

var ncz = "hi";
console.log(window.ncz);

在全局作用域上使用let或const,雖然會在全局作用域上創建新的綁定,但不會有任何屬性被添加到全局對象上。這也就意味著你不能用let或const來覆蓋一個全局變數,你只能將其屏蔽。

 let RegExp = "hello";
console.log(window.RegExp);//function
console.log(window.RegExp === RegExp);//false

const ncz = "hi";
console.log(ncz);//hi
console.log("ncz" in window);//false

隨著更多的開發者遷移到es6上,一種替代方案變得更為流行,那就是在預設情況下使用const,並且只有在知道變數值需要被更改的情況下才使用let。其理論依據是大部分變數在初始化之後都不應當被修改,因為預期外的改動是bug的源頭之一。


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 1、抽象類中包含一個內部介面如何實現與調用 2、介面中包含一個內部抽象類如何調用 ...
  • 十分鐘學會Pandas 這是關於Pandas的簡短介紹主要面向新用戶。你可以參考Cookbook瞭解更複雜的使用方法 習慣上,我們這樣導入: 創建對象 請參閱數據結構簡介部分 通過傳遞一個列表的值創建一個Series,讓Pandas創建一個預設的整數索引: 通過傳遞的numpy數組創建一個DataF ...
  • 本篇實現Arduino與FPGA交互,當然也沒有什麼新的協議,還是基於串口通訊,現在學一個串口通信基本上可以驅動大多數模塊了,而且和各種單片機無縫數據交互,Arduino由於其強大的庫函數支持,在實現很多事情上會方便很多,比如串口通訊,Arduino就兩行的代碼,Verilog至少也得上百行,但是從 ...
  • 模塊 其實前面都說過的,不過還是系統的再說一次,相信學到這,大部分都被搞忘了吧,所以再提一下,也為後面的博文做鋪墊 1.什麼是模塊 在程式的開發過程中,隨著程式代碼越寫越多,在一個文件里代碼就會越來越長,越來越不容易維護,不斷的滾雪球式的增長。為了維護好代碼,我們把很多類和函數分組,分別放到不同的p ...
  • 先上代碼 代碼執行結果是 載入類時執行 先執行我! 我雖然寫在初始化塊前但是實際先執行初始化塊里的內容再執行我 先執行我! 我雖然寫在初始化塊前但是實際先執行初始化塊里的內容再執行我 先執行我! 我雖然寫在初始化塊前但是實際先執行初始化塊里的內容再執行我 參考文章 http://www.cnblog ...
  • 定義類的方法,相信你會說,不就是在class語句下使用def () 就是定義類的方法了嘛,是的,這是定義的方法的一種,而且是最普通的方式 首先,我們已經知道有兩種方式: 1.普通方法: 1)與類無關的方法 2)與類相關的方法: 能夠被類直接調用的方法,而實例化因為沒有self綁定,會把自身作為參數傳 ...
  • 在js已有的基本類型(字元串,數值,布爾型,null和undefined)之外,es6引入了一種新的基本類型:==符號(Symbol)==。符號起初被設計用於創建對象私有成員。 符號沒有字面量形式,你可以使用全局Symbol函數來創建一個符號值。 Symbol還可以接受一個額外的參數用於描述符號值。 ...
  • js 數組的push方法,想必大家都知道是向數組末尾添加元素,但是有一個很關鍵的點需註意: 引自 MDN 返回值 當調用該方法時,新的 length 屬性值將被返回。 數組push之後返回的是length,而不是新的數組,如果不清楚這點,在使用過程中回遇到很大的坑。 順帶記一下其他幾個數組的方法返回 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...