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