摘要:聲明變量不存在變量提升。臨時(shí)死區(qū),而且不能在聲明之前訪問它。禁止重復(fù)聲明相同的變量,否則報(bào)錯(cuò)。不存在變量提升,一旦執(zhí)行快外就會(huì)立即銷毀。聲明不允許修改綁定,但允許修改值,也就是說用創(chuàng)建對(duì)象后,可以修改該對(duì)象的屬性值。
知識(shí)點(diǎn)
1、存在變量提升,實(shí)際上var無論在哪里聲明,都會(huì)被當(dāng)做當(dāng)前的作用域頂部聲明變量。 2、可以重復(fù)聲明,后聲明的變量會(huì)覆蓋前聲明的變量。
1、不存在變量提升。 2、禁止重復(fù)聲明。 3、塊級(jí)作用域,只在當(dāng)前作用域塊有用。 4、臨時(shí)死區(qū),而且不能在聲明之前訪問它。
1、const 聲明的是常量,其值一旦確定后不可以修改 2、const 聲明常量時(shí)候必須要進(jìn)行賦值 3、const 不存在變量提升,一旦執(zhí)行快外就會(huì)立即銷毀。 4、const 只能在當(dāng)前代碼塊級(jí)有效, 5、const 不能重復(fù)聲明相同常量。 6、const聲明不允許修改綁定,但允許修改值,也就是說用const創(chuàng)建對(duì)象后,可以修改該對(duì)象的屬性值。一、聲明JavaScript的變量有哪些?
每種編程語言都有變量,聲明變量的方法各不同,在JavaScript里面,最經(jīng)典的var聲明一個(gè)變量,當(dāng)ECMAScript6出現(xiàn)后,新增了2個(gè)聲明變量的方法:let和const,那何時(shí)創(chuàng)建變量,用什么聲明變量方法會(huì)更好呢?
二、先談?wù)剉ar聲明及變量提示(hoisting)機(jī)制var聲明一個(gè)變量時(shí)候,只需要 var name; 或者聲明賦值var name = "Bob";
實(shí)際上var無論在哪里聲明,都會(huì)被當(dāng)做當(dāng)前的作用域頂部聲明變量。
// var 的變量提升機(jī)制 function getValue(condition) { if (condition) { var values = "Bob"; return values; } else { console.log(values); // 這里訪問到values 是undefined,原因下面解釋: return null; } } // 原因解釋:為什么上面的代碼else還能訪問values的值,雖然是undefined // 無論變量values都會(huì)被創(chuàng)建,在編譯過程中,JavaScript引擎會(huì)將上面的getValue函數(shù)修改成這樣: function getValue(condition) { // 重點(diǎn)看這里,變量values的聲明被提升到函數(shù)頂部 var values; if (condition) { values = "Bob"; return values; } else { console.log(values); // 所以這里訪問到是聲明過的但未賦值的values,所以是undefined。 return null; } }三、塊級(jí)聲明的出現(xiàn)
塊級(jí)聲明用于聲明在指定的塊的作用域之外無法訪問的變量
函數(shù)內(nèi)部
塊級(jí)中(字符{ }之間的區(qū)域)
四、let聲明let聲明變量和var聲明變量,但let有自己的四個(gè)特征:
塊級(jí)作用域,限制在當(dāng)前的塊級(jí)作用域中,外面作用域無法訪問。
不存在變量提升。
臨時(shí)死區(qū),而且不能在聲明之前訪問它。
禁止重復(fù)聲明相同的變量,否則報(bào)錯(cuò)。
我們可以把剛才聊到的getValue函數(shù)修改一下:
// let 塊級(jí)作用域 && 不存在變量提升 function getValue(condition) { if (condition) { // 使用let聲明變量 let values = "Bob"; return values; } else { console.log(values); // 這里報(bào)錯(cuò): ReferenceError: values is not defined.. // 原因就是用let聲明的變量,是不存在變量提升的, // 而且values變量只能在if{ 這個(gè)作用塊里面有效 } 外面是訪問不到的 // 同時(shí),在外面訪問不僅會(huì)訪問不到,而且會(huì)報(bào)錯(cuò) return null; } } // let 禁止重復(fù)聲明相同變量 function getValue() { var values = "Bob"; let values = {name: "Bob"}; // 使用let聲明變量禁止重復(fù)聲明已經(jīng)有的變量名 // 否則報(bào)錯(cuò):SyntaxError: Identifier "values" has already been declared }五、const聲明
const 聲明的是常量,其值一旦確定后不可以修改。
const 聲明常量時(shí)候必須要進(jìn)行賦值。
const 不存在變量提升,一旦執(zhí)行快外就會(huì)立即銷毀。
const 只能在當(dāng)前代碼塊級(jí)有效,
const 不能重復(fù)聲明相同常量。
const聲明不允許修改綁定,但允許修改值,也就是說用const創(chuàng)建對(duì)象后,可以修改該對(duì)象的屬性值。
function getValue() { // 聲明一個(gè)常量 const USER_NAME = "梁鳳波"; // 禁止重復(fù)聲明相同常量,否則報(bào)錯(cuò):TypeError: Assignment to constant variable. // const USER_NAME = "Bob"; // 記?。篶onst聲明不允許修改綁定,但允許修改值, // 也就是說用const創(chuàng)建對(duì)象后,可以修改該對(duì)象的屬性值 const STUDYENT = { name: "梁鳳波" }; console.log(`STUDYENT.name = ${STUDYENT.name}`); // STUDYENT.name = 梁鳳波 STUDYENT.name = "Bob"; console.log(`STUDYENT.name = ${STUDYENT.name}`); // STUDYENT.name = Bob }拓展:循環(huán)中的塊級(jí)作用域綁定
// 在for循環(huán)內(nèi)用var 聲明,在外面訪問到的是for循環(huán)后的結(jié)果 for (var i = 0; i < 10; i++) { } console.log(`i = ${i}`); // i = 10 // 在for循環(huán)內(nèi)用let 聲明,在外面 訪問不到,塊級(jí)作用域問題 for (let i = 0; i < 10; i++) { } console.log(`i = ${i}`); // ReferenceError: i is not defined
// 經(jīng)過for循環(huán)后,在外面訪問i,是直接訪問到了結(jié)果i = 10 let funcs = []; for (var i = 0; i < 10; i++) { funcs.push(function () { console.log(i); }) } funcs.forEach(func => { func() // 分別輸出10次10 });
原因:循環(huán)里每次迭代同時(shí)共享著變量i,循環(huán)內(nèi)部創(chuàng)建的函數(shù)全保留相同變量的引用,循環(huán)結(jié)束時(shí)候i的值變?yōu)?0,所以每次調(diào)用console.log(i)時(shí)候回輸出數(shù)字10
為了解決這個(gè)問題,可以在循環(huán)中使用立即調(diào)用函數(shù)表達(dá)式(IIFE),以強(qiáng)制生成計(jì)數(shù)器變量的副本:
// 如果要理想效果,在外面分別輸出 0 ~ 9, // 可以使用閉包暴露出去 let funcs = []; for (var i = 0; i < 10; i++) { funcs.push((function (val) { return function () { console.log(val); } }(i))) } funcs.forEach(func => { func() });
let funcs = []; for (let i = 0; i < 10; i++) { funcs.push(function () { console.log(i); }) } funcs.forEach(func => { func() // 分別輸出 0 ~ 9 });
let 聲明模仿上述示例IIFE所做的一切簡(jiǎn)化循環(huán)過程,每次迭代循環(huán)都會(huì)創(chuàng)建一個(gè)新變量,并以之前迭代中同名變量的值將其初始化。
let funcs = []; let obj = { a: true, b: true, c: true } for (const key in obj) { funcs.push(function () { console.log(key); }) } funcs.forEach(func => { func() // 分別輸出 a, b, c Authorization });
let和const聲明循環(huán),const循環(huán)是不能改變key的值,const 循環(huán)應(yīng)該使用for-in,for-of,其他和let示例一樣,因?yàn)槊看蔚粫?huì)像var循環(huán)例子一樣修改已有的綁定,而是會(huì)創(chuàng)建一個(gè)新綁定。
全局塊級(jí)作用域綁定var RegExp = "Bob"; // 即使是全局對(duì)象RegExp定義在window,也不能幸免被var聲明覆蓋 console.log(RegExp); // Bob console.log(window.RegExp); // Bob let RegExp = "Bob"; // 用let或const聲明不能覆蓋全局變量,而只能屏蔽它 console.log(RegExp); // Bob console.log(window.RegExp); // undefined console.log(window.RegExp === RegExp); // false const ncz = "Hi!" console.log("ncz" in window); // false最后聊一聊塊級(jí)綁定的最佳實(shí)踐
默認(rèn)使用const,只在確實(shí)需求改變變量的值使用let,這樣就可以在某種程度上實(shí)現(xiàn)代碼的不可變,從而防止默寫錯(cuò)誤產(chǎn)生。
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/95298.html
摘要:前言項(xiàng)目地址如果有想要增加的特性,歡迎更新,然后。環(huán)境大致結(jié)論許多情況下下的特性表現(xiàn)相對(duì)更好。 前言 項(xiàng)目 github 地址:https://github.com/DavidCai1993/ES6-benchmark 如果有想要增加的特性 benchmark ,歡迎更新benchmarks/ ,然后 PR 。 環(huán)境 CPU: Intel Core(TM) i5-2410M 2.30...
摘要:的翻譯文檔由的維護(hù)很多人說,阮老師已經(jīng)有一本關(guān)于的書了入門,覺得看看這本書就足夠了。前端的異步解決方案之和異步編程模式在前端開發(fā)過程中,顯得越來越重要。為了讓編程更美好,我們就需要引入來降低異步編程的復(fù)雜性。 JavaScript Promise 迷你書(中文版) 超詳細(xì)介紹promise的gitbook,看完再不會(huì)promise...... 本書的目的是以目前還在制定中的ECMASc...
摘要:最近買了深入理解的書籍來看,為什么學(xué)習(xí)這么久還要買這本書呢主要是看到核心團(tuán)隊(duì)成員及的創(chuàng)造者為本書做了序,作為一個(gè)粉絲,還是挺看好這本書能給我?guī)硪粋€(gè)新的升華,而且本書的作者也非常厲害。 使用ES6開發(fā)已經(jīng)有1年多了,以前看的是阮一峰老師的ES6教程,也看過MDN文檔的ES6語法介紹。 最近買了《深入理解ES6》的書籍來看,為什么學(xué)習(xí)ES6這么久還要買這本書呢?主要是看到Daniel A...
摘要:塊級(jí)綁定拓展對(duì)象功能解構(gòu)改進(jìn)的數(shù)組代理和反射附錄小的改變附錄 understanding es6 -- Nicholas C. Zakas 塊級(jí)綁定 function 拓展對(duì)象功能 解構(gòu) symbol Sets and Maps Iterators and Generators class 改進(jìn)的數(shù)組 promise 代理和反射 -- Proxy&Reflection mo...
閱讀 641·2021-11-22 15:32
閱讀 2726·2021-11-19 09:40
閱讀 2322·2021-11-17 09:33
閱讀 1280·2021-11-15 11:36
閱讀 1876·2021-10-11 10:59
閱讀 1487·2019-08-29 16:41
閱讀 1791·2019-08-29 13:45
閱讀 2162·2019-08-26 13:36