摘要:前世在還未出現前,的世界一直是的統治在中用于變量聲明的關鍵字。的出現給帶來了塊級作用域,解決了變量提升,禁止了重復聲明變量,讓少了很多疑惑的地方。時代已經過去了,各種特性用起來。
前世
在 const & let 還未出現前,JS 的世界一直是 var的統治
var:在JS中用于變量聲明的關鍵字。
特點:
變量提升
只有函數作用域或者全局作用域,沒有塊級作用域
重復聲明變量
循環體重的閉包會出現問題
…….
變量提升
function test(tag) { console.log(a,b); // a,b在下面聲明,但是會打印出undefined,不會報錯 if(10 >= tag) { var a = tag + 1; } else { var b = tag - 1; } }
在瀏覽器預解析機制中,加載函數的時候,此時的作用域為函數作用域,函數作用域中JS會先將所有的聲明置頂。
function test(tag) { var a,b; // 將聲明置頂,但是賦值并不會 console.log(a,b); // a,b在下面聲明,但是會打印出undefined,不會報錯 if(10 >= tag) { var a = tag + 1; } else { var b = tag - 1; } }
只有函數作用域以及全局作用域,沒有塊級作用域
function test(tag) { console.log(a,b); // a,b在下面聲明,但是會打印出undefined,不會報錯 if(10 >= tag) { var a = tag + 1; } else { var b = tag - 1; } console.log(a); // 9 } test(8) // 9
按照其他語言規則 if 是一個程序塊,在 if 中聲明的變量作用域只能在 if 中,但是 JS 因為只有函數作用域和全局作用域,所以才會導致在 if 判斷外還可以訪問 if 的變量
重復聲明變量
var a = 1; var a = 2; console.log(a); // 2
在使用var的時候允許重復聲明變量也是令人頭痛的事情,也許因為這個機制,可能就會出現bug
循環體重的閉包會出現問題
var arr = []; for(var i = 0; i < 3; i++) { arr.push(function () { return i; }) } for(var j = 0; j < 3; j++) { console.log(arr[j]()); // 3,3,3 } 將var -> let 將會打印出 0,1,2
因為缺乏塊作用域所以導致問題出現
今生如今距離ES6規范的出現已經過去了4年多了,在項目中也早已開始大量使用ES6規范編寫代碼了。var也不再是JS世界的唯一了,
JS 世界出現了const & let。
const & let 的出現給JS帶來了塊級作用域,解決了變量提升,禁止了重復聲明變量,讓JS少了很多疑惑的地方。
let & const相同點:
具有塊級作用域
禁止重復聲明變量
不會產生變量提升
區別:
let
使用let聲明的基本類型變量是可以改變值
let a = 12; a = 13; return a; // 13
使用let聲明引用類型的變量是可以改變引用的
let info = { name: "ming995", age: 25, sayHi: function() { console.log(`Hi I"m ${this.name}`) } }; let heInfo = {}; heInfo = info; heInfo.name = "Jack"; console.log(heInfo);
const
使用const聲明的基本類型變量是不可以改變值
const a = 13; a = 14; return a; // 報錯
使用const聲明引用類型的變量是不可以改變引用的
const info = { name: "ming995", age: 25, sayHi: function() { console.log(`Hi I"m ${this.name}`) } }; const heInfo = {}; heInfo = info; // 報錯 heInfo.name = "Jack"; console.log(heInfo);
但是我們可以操作const聲明的引用類型的屬性值
const info = { name: "ming995", age: 25, sayHi: function() { console.log(`Hi I"m ${this.name}`) } }; info.language = "js"; console.log(info);總結
之前對于const的理解有偏差,所以就寫這篇文章。var時代已經過去了,ES6各種特性用起來。
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/100786.html
本篇文章主要講述JS中let與const命令使用,通過代碼展示給各位。 let命令 基本使用 在ES6中,let命令是新增的聲明變量,與var的差異在于let無法重復聲明,且let有效只是在其命令的代碼塊內,let禁止變量出現變量提升現象,let的特點就是通過暫時性死區的方式來避免程序上的錯誤 代碼塊:使用{}包括起來的內容 聲明變量:分配一個存儲空間 不可重復聲明:let聲明過后...
摘要:聲明的變量只在其所在的代碼塊內有效。只要在聲明之前使用這些變量,就會報錯。在語法上稱為暫時性死區有時候,會不經間遇到比較隱蔽的死區,不太容易被發現。不允許重復聲明不允許在相同的作用域內聲明同一個變量。一旦聲明,其值就不能再改變。 let && const let let聲明的變量只在其所在的代碼塊內有效。 { let a = 10; } console.log(a) //R...
摘要:副作用,無副作用可執行和關鍵詞。和不能像一樣同一個下聲明多次和不會像一樣變量聲明提升原因是,存在因此不能,賦值前使用變量。 showImg(https://segmentfault.com/img/bVbhPlD?w=1271&h=715); 關鍵詞: let ,const, blocking scope ,temporal dead zone,redeclaration,reassi...
我們說下想要實現,一副牌里有54張,我們可以知道 3 - 2 的牌總共有13張,這分為4個花色是 ?? ?? ?? ?? 另外加上2個大小王!第一步:形成一個數組, 就要寫一個函數,利用牌數量和花色,這樣可以用來形成一個雙重循環將 number 里面的內容 和 flower 里面的內容 進行一個循環嵌入?最后在用 push 生成一個對象放到數組的后面?再到最后放入 大小王 。 constnu...
大數據中時常都會有優化,這篇文章要和大家降的就是如何按照特定的條件刪除一個數組? 1、如何刪除數組中的元素 場景:有一個數組,需要刪除滿足條件的數組。 示例: constarr=[1,2,3,4,5,6,7,8] 刪除小于5的元素,刪除后的元素為 constarr2=[5,6,7,8] 代碼實現: constarr=[1,2,3,4,5,6,7,8] for(leti=0,le...
閱讀 1944·2021-10-12 10:12
閱讀 3072·2019-08-30 15:44
閱讀 843·2019-08-30 15:43
閱讀 2994·2019-08-30 14:02
閱讀 2076·2019-08-30 12:54
閱讀 3496·2019-08-26 17:05
閱讀 1979·2019-08-26 13:34
閱讀 1050·2019-08-26 11:54