不要再在JavaScript中用『var』聲明變量了

2020-12-22 讀芯術

全文共2218字,預計學習時長7分鐘

對`const` 和`let`的介紹

大家都始於初學者。我學到在JavaScript中用關鍵詞var來聲明變量,這是一個簡單且有效的方法,但如今我已做出改變。

若你還在編寫類似var x = 5的代碼,那你需要停下來。說實話,你不必停止,但應該如此。

人們常常將程式語言視作視為一系列金科玉律。但事實上程式語言就像任何一個口頭語言一樣,是不斷變化發展的。

現在我用關鍵詞const和let在JavaScript中聲明所有變量,你也應該這麼做。

讓我們一起學習如何且為什麼要這麼做。

聲明真正的常量

變量,顧名思義即變化的值。雖然聲明和不接觸變量並沒有什麼問題,但是如果想要編寫具有語義的代碼,則應該區分變量和常量。

常量與變量相反,是聲明的不變值。歷史上,人們用大寫所有的字母來定義一個常數,例如有毒的動物身上的鮮豔顏色。

不用依賴慣例,const關鍵字的引入為人們提供了一個明確的選項,用於聲明哪個值不會更改。

要使用const關鍵字,只需將var替換為const,就無法修改該值了。

// the old way// var sales_tax = 0.06;// the new wayconst sales_tax = 0.06;sales_tax = 0.08; // "TypeError: Assignment to constant variable.

實現方式非常簡單,原理也非常簡單。使用const甚至不用動腦,但什麼時候用才合適呢?

諸如稅率或單位之間的轉換的數字比率可作為選擇。另外還會在使用箭頭符號聲明函數時使用const。

const myFunction = (x,y) => { // Do stuff}myFunction(1,2)

這樣函數就不會被覆蓋了。

修復JavaScript的異常範圍

JavaScript缺乏範圍清晰性,常導致開發和故障排除的失敗。以下是JavaScript範圍異常的摘要:

· 一個變量可以使用兩次var(重聲明)

· 默認情況下,頂級變量是全局變量(全局對象)

· 可以在聲明前使用變量(提升)

· 循環中的變量重複使用同樣的引用(閉包)

使用let可以澄清和解決許多這些異常。來仔細看看吧。

重聲明

這很簡單,由let構成的變量是無法重聲明的。

var x = 0;let y = 0;var x = 1;let y = 1; // "SyntaxError: Identifier 'y' has already been declared

全局對象

由var定義的頂級變量會作為系統屬性被自動添至全局變量,但由let定義的變量就不會。

var x = 0;let y = 0;console.log(window.x); // 0console.log(window.y); // undefined

提升

由let定義的變量只能在其塊級作用域內訪問,而由var定義的變量會被提升至函數級別。

// Using varconsole.log(i); // undefinedfor(var i=0; i<4; i++) { console.log(i);}console.log(i); // 4//Using letconsole.log(j); // "ReferenceError: j is not definedfor(let j=0; j<4; j++) { console.log(j);}console.log(j); // "ReferenceError: j is not defined

閉包

如果閉包對你來說是一個新概念的話,那可能會難以理解,但是閉包是引用自由變量的函數。

當閉包中帶有var時,該引用會被記住,當循環中的變量發生變化時,會造成麻煩。

var functions = [];for (var i = 0; i < 3; i++) { functions[i] = () => { console.log(i); };}for (var j = 0; j < 3; j++) { functions[j]();}// 3 3 3

如果使用let,每次都會創建新的引用。

var functions = [];for (let i = 0; i < 3; i++) { functions[i] = () => { console.log(i); };}for (var j = 0; j < 3; j++) { functions[j]();}// 0 1 2

說到底,即使不是100%出於這些原因以及它們為何按其工作方式工作,切換到let還將產生更明確的代碼,這些代碼的行為始終如一,並且更易於故障排除和維護。

告誡

儘管let和const應該可以有效替換var關鍵字,但是一切並不總是那麼簡單。

由於這些關鍵字是在ECMAScript2015(ES6)中引入的,因此,如果你使用的平臺不允許使用該關鍵字,那就很不幸了。此外,還要確保你的代碼可以在目標受眾群體的瀏覽器中正常運行。

留言點讚關注

我們一起分享AI學習與發展的乾貨

如轉載,請後臺留言,遵守轉載規範

相關焦點

  • JavaScript小知識:var聲明提升和let聲明暫時性死區
    在聲明變量時,使用var聲明的變量會被提升到作用域的頂部,因此可以執行以下操作:function foo(){console.log(age);//undefined並且還允許我們重複聲明一個變量而不會造成語法錯誤:function foo(){var age=20;var age=25;var age=30;var age=31;
  • JavaScript let 與var 區別及var弊端
    都是通過var聲明 全局作用域 全局(在函數之外)聲明的變量擁有全局作用域。 JavaScript 塊作用域 通過 var 關鍵詞聲明的變量沒有塊作用域。 在塊 {} 內聲明的變量可以從塊之外進行訪問。
  • 說說那些經典的web前端面試題-JavaScript部分
    (2)、typeof 來獲取一個變量是否存在,如 if(typeof a!="undefined"){alert("ok")},而不要去使用 if(a) 因為如果 a 不存在(未聲明)則會出錯。(3)、對於 Array,Null 等特殊對象使用 typeof 一律返回 object,這正是 typeof 的局限性。
  • 第一篇:JavaScript基本語法
    JavaScript語法結構類似Java語言,但JavaScript的語法規則要比Java語言的語法規則簡單的多,若在Java語言基礎上,再學習JavaScript就會很容易上手。(2)JavaScript是弱數據類型在JavaScript中,變量聲明採用弱類型,即變量在使用前不需要做聲明,而是由解釋器在運行時檢查其數據類型。
  • 什麼是javascript?javascript需要學哪些內容?這篇文章告訴你!
    聲明變量使用關鍵字:var(variable)你給它賦什麼類型的值,那麼這個變量就是什麼數據類型。4.1.4 遺漏聲明4.1.5 顯示聲明與隱式聲明區別JS中變量聲明分顯式聲明和隱式聲明。>4.2 JavaScript 嚴格模式(use strict)4.3 變量提升變量一定要先聲明後使用,如果先使用後聲明,js的內部機制自然使變量提升。
  • JavaScript小知識:let和var的作用域
    在ECMAScript6中又新增了兩個變量聲明關鍵字:let和const。那麼這個有什麼不同?var只有全局作用域和函數作用域,所謂全局作用域就是在代碼的任何位置都能訪問var聲明的變量,而函數作用域在變量聲明的當前函數內部訪問變量。函數外部是無法訪問函數內部聲明的變量的var messageOne="hello word !"
  • JavaScript組件模式深入淺出
    全局導入(Global Import)JavaScript 有一個大家熟知的特性叫做implied globals,就是當使用一個變量的時候,解釋器會沿著作用域鏈一直向上查找這個變量的定義,如果沒找到,這個變量就會自動成為一個全局(global)變量。這意味著在一個匿名閉包裡去創建一個全局變量變得非常簡單。
  • 我的JavaScript的學習筆記:let、var 和const的作用域
    ECMAScript 6(簡稱ES6)引入了兩個新的變量聲明關鍵字:let和const。那麼新增的let和const與var有什麼區別?我們知道var只有全局作用域和函數作用域,全局作用域就是指在在全局環境中聲明的能在代碼的任何位置訪問的變量。函數作用域是指在在函數內部聲明的只能在這個函數內部訪問的變量。var a="hello word !"
  • 3.2.3 JavaScript中for循環語句的使用
    其語法格式如下:for(初始化語句,條件表達式,迭代語句){語句組}參數說明:1)初始化語句:一般用來對循環變量進行初始化賦值。2)條件表達式:作為循環條件,一個包含比較運算符的表達式,用來限定循環變量的邊限。如果循環變量的值超出了該邊限,則停止該循環語句的執行。3)迭代語句:用來改變循環變量的值,從而控制循環的次數,通常是對循環變量的值進行變大或變小的操作。
  • 西安藍鷗丨45個有用的JavaScript技巧
    1、首次為變量賦值時務必使用var關鍵字變量沒有聲明而直接賦值得話,默認會作為一個新的全局變量,要儘量避免使用全局變量。2、使用===取代====和!=操作符會在需要的情況下自動轉換數據類型。但===和!==不會,它們會同時比較值和數據類型,這也使得它們要比==和!=快。
  • 什麼是JavaScript對象?如何創建並引用?這就告訴你!
    二、對象的創建(重點)2.1怎樣創建對象語法:var obj = { key : value };上面代碼定義了一個對象,它被賦值給變量obj。>var obj2 = new Object();var obj3 = Object.create(null);Object是在javascript中一個被我們經常使用的類型,而且JS中的所有對象都是繼承自Object對象的三、對象的鍵名和鍵值
  • 第41節 Document文檔節點-Javascript
    DOCTYPE html>如果存在文檔聲明,則將其作為document的第一個子節點,解析DOCUMENTTYPE_NODE類型,如果沒有聲明,則為null;註:DocumentType對象不能動態創建,它是只讀的;查找元素(選取文檔元素):在DOM中,取得特定的某個或某組元素,並執行一些操作,這是最重要的應用了;為了獲取文檔中的這些元素
  • web前端開發成都:js中的變量
    JS中的數據類型分為兩大類1,基本數據類型<1>數字 number 100 3.14<2>字符串 String 所有帶單引號/雙引號 'HELLO' "HELLO"<3>布爾值 boolean 是/否 true false<4>特殊數據類型 null空值 undefined未聲明
  • JavaScript-window對象常用屬性及方法有哪些?
    (3)location 對象,瀏覽器當前URL信息;(4)navigator 對象,瀏覽器本身信息;(5)screen 對象,客戶端屏幕信息;(6)history 對象,瀏覽器訪問歷史信息;在瀏覽器中,window對象有雙重角色,它既是通過javascript
  • let 與 var 的區別
    bug收集:專門解決與收集bug的網站網址:www.bugshouji.comlet、var申明變量未賦值
  • JavaScript運算符:遞增和遞減
    來看個例子:var age = 29;var anotherAge = --age + 2;console.log(age) console.log(anotherAge); 這個示列中變量anotherAge的初始值等於變量age的值前置遞減(age = age - 1)再加上2。
  • Javascript去除字符串中的點或其他符號
    在前端上使用javascript進行操作的。測試了兩次沒有好用,程序直接把整個字符串都進行了替換,在考慮這個是為什麼呢?javascript(請忽略此配圖)示例var ip = data.field.ip.replace(/.
  • Excel VBA(6)–聲明變量那些事
    聲明變量 既然變量是可以自定義的,我們在使用之前就要對它進行聲明。為什麼要聲明變量 既然有 72 般變化的 Variant 類型,為什麼還要聲明變量? 因為 Variant 佔用的存儲空間較大,無論程序運行速度還是存儲空間,都不優化。所以如非必要,請不要免去聲明變量步驟 7.
  • 20個常用的JavaScript簡寫技巧
    聲明變量 2. 給多個變量賦值 我們可以使用數組解構來在一行中給多個變量賦值。 3. 三元運算符 我們可以使用三元(條件)運算符在這裡節省 5 行代碼。 4.
  • 第四篇:JavaScript基本數據類型
    不同於Java語言,JS 語言是弱數據類型,聲明變量時不需要說明數據類型,JS解釋器會自動根據變量的值賦予變量對應的數據類型。JS語言是基於對象的語言,因此數據類型是以對象方式存在的,每個數據類型都有自己的方法和屬性、String(字符串類型)String是字符串類型,每個實例化的字符串變量都是一個String對象。