ES6新語法之let關鍵字;有別於傳統關鍵字var的使用

来源:http://www.cnblogs.com/Trista-l/archive/2017/05/22/6866784.html
-Advertisement-
Play Games

ES6新語法於2015年發佈;而我這個前端小白在17年才接觸到。慚愧慚愧!!不過到目前為止,似乎只有FireFox和Chrome對ES6的支持相對良好。不過既然人家ES6已經出來了,還是要跟上技術的潮流。 ES6給我的感覺就是讓js越來越靠近傳統的編程語言,如java;比如裡面的面向對象的思想和語法 ...


ES6新語法於2015年發佈;而我這個前端小白在17年才接觸到。慚愧慚愧!!不過到目前為止,似乎只有FireFox和Chrome對ES6的支持相對良好。不過既然人家ES6已經出來了,還是要跟上技術的潮流。

ES6給我的感覺就是讓js越來越靠近傳統的編程語言,如java;比如裡面的面向對象的思想和語法就很接近java。所以如果有學習後端語言的童鞋的話,理解相對可能會比較好一點。額額。。好像扯得有點距離。 

今天就只是說一下新增的let關鍵字:

傳統的 var 關鍵字1:

   以前我們定義變數都是使用的var關鍵字。那麼ES6要新增一個let關鍵字來替換var的話,原因在哪裡?代碼中來呈現:

 

以上只是個很簡單的小例子,以求能夠說明問題即可。在for迴圈外面定義了一個變數n並且給它賦了值;而在for迴圈裡面我又定義了一個變數n。迴圈結束之後在迴圈的外面調用n的值,結果為5;但是我這個時候想要的n的值是我之前的定義的n的值是等於10;現在卻出現了與結果相悖。原因在於js是函數級作用域。上面的那個作用域是屬於塊級作用域的範圍。恰好呢js沒有!這就很好理解上面的小例子。也就是說,下麵在迴圈體裡面定義的n並不是一個局部變數,而是一個全局變數,它覆蓋了上面定義的n。所以n自然是迴圈之後的結果。那如果我這麼寫:

得到的結果是多少呢?不言而喻了。既然是函數級作用域了。函數裡面的n自然就是局部變數了。在函數外面是無法訪問的。

如果說上面的例子不太直觀展現的話,可以來看看一個比較經典的例子

運行arr[2]()函數之後的結果是2?還是10?結果又是不如人願了。是10!!第一次敲得時候感覺有點小失望小崩潰。沒有哪裡存在語法錯誤,沒有引用錯誤。但是結果就是10。永遠不會得到2。究其原因又是我上面說到的作用域的問題。i這個時候是全局變數了。每一次的迴圈並不是一個單獨體,而是一個受影響的整體。所以數組裡的結果都是10;這個需要好好的理解一下。有點不太好懂。

傳統的 var 關鍵字2:

var關鍵字還有一個比較明顯的特質:變數提升的問題。變數提升,就是把變數的定義提升到函數的頂部,但是變數的賦值位置還是不變即賦值不會被提升。上面所說的作用域的問題可以和這個變數提升的問題一起合攏來看,也許對問題就有一個比較全面的理解。

在這個簡單的例子中,得到的結果不是報錯而是undefined。原因就是變數a,b,c的定義提升了。而值沒有提升。那麼執行到輸出的時候自然是undefined。

上面那個的執行情況如下

這樣看應該就比較好理解了。

說了那麼多關於var的問題。那麼來看看let是如何解決的

關鍵字let 1:

函數的作用域問題:

  let關鍵字是更像是傳統的編程語言中的變數的使用。他使得變數有了塊級作用域。

 再來看上面那個要出錯的迴圈語句,用let關鍵字之後:

]

明顯得到了想要的結果!!因為用let聲明i變數的時候,i不是全局了而是局部。每一次的迴圈都是一次單獨的個體。上一次的不會影響下一次。所以能夠得到正解!

關鍵字let 2:

在之前說過var關鍵字存在變數的提升問題,也就是變數的定義會提升到頂部。而let則沒有這個問題。

i在定義之間進行操作;在let里是不被允許的。而用var的時候不會報錯,結果為undefined。這也說明瞭let不會存在變數提升的問題。所以使用的時候要先定義後使用。

由於let讓js具有塊級作用域,所以如果在塊外面和裡面都同時定義了相同的變數;那麼塊級裡面進行操作的時候是不管外面有無定義,只管塊級裡面。


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

-Advertisement-
Play Games
更多相關文章
  • 上篇用了單工程創建了SSM整合的web工程(http://www.cnblogs.com/yuanjava/p/6748956.html),這次我們把上篇的單工程改造成為多模塊工程 一:創建對應的多工程 首先原工程有對應的包如下 因為原單工程是 contoller 調用 service ,servi ...
  • 作業:計算器開發 (1)實現加減乘除及拓號優先順序解析; (2)用戶輸入 1 - 2 * ( (60-30 +(-40/5) * (-9-2*5/-3 + 7 /3*99/4*2998 +10 * 568/14 )) - (-4*3)/ (16-3*2) )等類似公式後,必須自己解析裡面的(),+,- ...
  • 有這麼一個有趣的問題,問: 有這麼一個不重覆的自然數數組,自然數長度為N,而數組長度為N 2,依次隨機把自然數放進數組中,請找出2個沒有被放進去的自然數。 例如:這個自然數數組是[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]這十個數,某次隨機放入的順序是[2, 1, 3, 5, 7, ...
  • 【題目描述】 小南有一套可愛的玩具小人,它們各有不同的職業。有一天,這些玩具小人把小南的眼鏡藏了起來。小南發現玩具小人們圍成了一個圈,它們有的面朝國內,有的面朝圈外。如下圖: 這時singer告訴小南一個謎題:“眼鏡藏在我左數第3個玩具小人的右數第1個玩具小人的左數第2個玩具小人那裡。” 小南發現, ...
  • 1.類的載入過程 JVM將類載入過程分為三個步驟:裝載(Load),鏈接(Link)和初始化(Initialize)鏈接又分為三個步驟,如下圖所示: 1) 裝載:查找並載入類的二進位數據; 2)鏈接: 驗證:確保被載入類的正確性; 準備:為類的靜態變數分配記憶體,並將其初始化為預設值; 解析:把類中的 ...
  • 三個月就這麼悄悄溜走了,本K對於前端雖然有了一定的認識,但對一些方面還是處於一種比較萌幣的狀態,就在這種萌幣狀態下,本K又跟著大神浩開始了後臺語言—PHP語言的學習。PHP的學習對於學過其他語言的人來說,是非常easy的(原因後續會提及),K在初次接觸的時候也就僅僅是對一些PHP的寫法有點膈應而已. ...
  • 時間複雜度上,紅黑樹在平均情況下插入,查找以及刪除上都達到了lgN的時間複雜度。 那麼有沒有查找效率更高的數據結構呢,答案就是本文接下來要介紹了散列表,也叫哈希表(Hash Table) 什麼是哈希表 哈希表就是一種以 鍵-值(key-indexed) 存儲數據的結構,我們只要輸入待查找的值即key ...
  • 設計模式一--單例設計模式 版權聲明:本文為博主原創文章,未經博主允許不得轉載。 一、定義 Singleton Pattern: 確保一個類只有一個實例,並且自行實例化並向整個系統提供這個實例。 二、分類 餓漢式單例類:類載入時就進行對象的實例化 懶漢式單例類:第一次引用類時,才進行對象的實例化。 ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...