摘要:更多前端文章變量提升概述變量可在聲明之前使用。正常運(yùn)行,控制臺(tái)輸出報(bào)錯(cuò),報(bào)錯(cuò),命令經(jīng)常會(huì)發(fā)生變量提升現(xiàn)象,按照一般邏輯,變量應(yīng)該在聲明之后使用才對(duì)。主要是為了減少運(yùn)行時(shí)錯(cuò)誤,防止變量聲明前就使用這個(gè)變量,從而導(dǎo)致意料之外的行為。
更多前端文章1、變量提升
概述:變量可在聲明之前使用。
console.log(a);//正常運(yùn)行,控制臺(tái)輸出 undefined var a = 1; console.log(b);//報(bào)錯(cuò),Uncaught ReferenceError: b is not defined let b = 1; console.log(c);//報(bào)錯(cuò),Uncaught ReferenceError: c is not defined const c = 1;
var 命令經(jīng)常會(huì)發(fā)生變量提升現(xiàn)象,按照一般邏輯,變量應(yīng)該在聲明之后使用才對(duì)。為了糾正這個(gè)現(xiàn)象,ES6 規(guī)定 let 和 const 命令不發(fā)生變量提升,使用 let 和 const 命令聲明變量之前,該變量是不可用的。主要是為了減少運(yùn)行時(shí)錯(cuò)誤,防止變量聲明前就使用這個(gè)變量,從而導(dǎo)致意料之外的行為。
2、暫時(shí)性死區(qū)概述:如果在代碼塊中存在 let 或 const 命令,這個(gè)區(qū)塊對(duì)這些命令聲明的變量,從一開始就形成了封閉作用域。凡是在聲明之前就使用這些變量,就會(huì)報(bào)錯(cuò)。
var tmp = 123; if (true) { tmp = "abc";//報(bào)錯(cuò),Uncaught ReferenceError: tmp is not defined let tmp; }
剖析暫時(shí)性死區(qū)的原理,其實(shí)let/const同樣也有提升的作用,但是和var的區(qū)別在于
var在創(chuàng)建時(shí)就被初始化,并且賦值為undefined
let/const在進(jìn)入塊級(jí)作用域后,會(huì)因?yàn)樘嵘脑蛳葎?chuàng)建,但不會(huì)被初始化,直到聲明語句執(zhí)行的時(shí)候才被初始化,初始化的時(shí)候如果使用let聲明的變量沒有賦值,則會(huì)默認(rèn)賦值為undefined,而const必須在初始化的時(shí)候賦值。而創(chuàng)建到初始化之間的代碼片段就形成了暫時(shí)性死區(qū)
3、不允許重復(fù)聲明let不允許在相同作用域內(nèi),重復(fù)聲明同一個(gè)變量。
// 報(bào)錯(cuò) function func() { let a = 10; var a = 1; } // 報(bào)錯(cuò) function func() { let a = 10; let a = 1; } function func(arg) { let arg; } func() // 報(bào)錯(cuò) function func(arg) { { let arg; } } func() // 不報(bào)錯(cuò)4、塊級(jí)作用域
在es5中我們會(huì)遇到下面這寫情況
第一種場(chǎng)景,內(nèi)層變量可能會(huì)覆蓋外層變量。
var tmp = new Date(); function f() { console.log(tmp); if (false) { var tmp = "hello world";//沒有塊級(jí)作用域tmp變量提升到函數(shù)作用域里導(dǎo)致tmp為undefined } } f(); // undefined
第二種場(chǎng)景,用來計(jì)數(shù)的循環(huán)變量泄露為全局變量。
var s = "hello"; for (var i = 0; i < s.length; i++) { console.log(s[i]); } console.log(i); // 5
上面代碼中,變量i只用來控制循環(huán),但是循環(huán)結(jié)束后,它并沒有消失,泄露成了全局變量。
let n = 5; if (true) { let n = 10; } console.log(n); // 5 }
let實(shí)際上為 JavaScript 新增了塊級(jí)作用域。
5、const注意點(diǎn)1、const聲明變量的時(shí)候必須賦值,否則會(huì)報(bào)錯(cuò),同樣使用const聲明的變量被修改了也會(huì)報(bào)錯(cuò)
2、const聲明變量不能改變,如果聲明的是一個(gè)引用類型,則不能改變它的內(nèi)存地址
const c ; //Uncaught SyntaxError: Missing initializer in const declaration const a= {a:1}; a.a=2; a={d:2};// Uncaught TypeError: Assignment to constant variable.
本質(zhì):const實(shí)際上保證的,并不是變量的值不得改動(dòng),而是變量指向的那個(gè)內(nèi)存地址所保存的數(shù)據(jù)不得改動(dòng)。對(duì)于簡(jiǎn)單類型的數(shù)據(jù)(數(shù)值、字符串、布爾值),值就保存在變量指向的那個(gè)內(nèi)存地址,因此等同于常量。但對(duì)于復(fù)合類型的數(shù)據(jù)(主要是對(duì)象和數(shù)組),變量指向的內(nèi)存地址,保存的只是一個(gè)指向?qū)嶋H數(shù)據(jù)的指針,const只能保證這個(gè)指針是固定的(即總是指向另一個(gè)固定的地址),至于它指向的數(shù)據(jù)結(jié)構(gòu)是不是可變的,就完全不能控制了
那么我們想得到不可修改的const要怎么做呢?應(yīng)該使用Object.freeze方法。
const foo = Object.freeze({}); // 常規(guī)模式時(shí),下面一行不起作用; // 嚴(yán)格模式時(shí),該行會(huì)報(bào)錯(cuò) foo.prop = 123; // 除了將對(duì)象本身凍結(jié),對(duì)象的屬性也應(yīng)該凍結(jié)。 var constantize = (obj) => { Object.freeze(obj); Object.keys(obj).forEach( (key, i) => { if ( typeof obj[key] === "object" ) { constantize( obj[key] ); } }); };
參考文章
ECMAScript 6 入門
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://specialneedsforspecialkids.com/yun/102823.html
摘要:它是一個(gè)通用標(biāo)準(zhǔn),奠定了的基本語法。年月發(fā)布了的第一個(gè)版本,正式名稱就是標(biāo)準(zhǔn)簡(jiǎn)稱。結(jié)語的基本擴(kuò)展還有一些沒有在這里詳細(xì)介紹。 前言 ES6標(biāo)準(zhǔn)以及頒布兩年了,但是,好像還沒有完全走進(jìn)我們的日常開發(fā)。這篇文章從ES6的基本類型擴(kuò)展入手,逐步展開對(duì)ES6的介紹。 ECMAScript和JavaScript JavaScript是由Netscape創(chuàng)造的,該公司1996年11月將JavaSc...
摘要:不允許在相同作用域內(nèi),重復(fù)聲明同一個(gè)變量。如但是在中則不再必要了,我們可以通過塊級(jí)作用域就能夠?qū)崿F(xiàn)本次主要針對(duì)中的變量和塊級(jí)作用域進(jìn)行了梳理學(xué)習(xí),并且通過與的實(shí)現(xiàn)方式進(jìn)行了對(duì)比,從而看出其變化以及快捷與便利。 ECMAScript 6.0(以下簡(jiǎn)稱 ES6)是 JavaScript 語言的下一代標(biāo)準(zhǔn),已經(jīng)在 2015 年 6 月正式發(fā)布了。它的目標(biāo),是使得 JavaScript 語言可...
摘要:聲明之函數(shù)作用域和全局作用域。塊級(jí)作用域不能重復(fù)聲明臨時(shí)性死區(qū)等特性用來解決變量存在的種種問題。塊級(jí)作用域終于在外面訪問不到了。一些常量聲明使用聲明的變量名全部大寫。 ES5之前javascript語言只有函數(shù)作用域和全局作用域,使用var來聲明變量,var聲明的變量還存在變量提升使人困惑不已。我們先來復(fù)習(xí)一下ES5的var聲明,再對(duì)比學(xué)習(xí)let和const 。 var var聲明之函...
摘要:返回一個(gè)對(duì)象,遍歷對(duì)象自身和繼承的所有可枚舉屬性不含,與相同和在紅寶書中就已經(jīng)提到過屬性,表示的是引用類型實(shí)例的一個(gè)內(nèi)部指針,指向該實(shí)例的構(gòu)造函數(shù)的原型對(duì)象。 半個(gè)月前就決定要將ES6的學(xué)習(xí)總結(jié)一遍,結(jié)果拖延癥一犯,半個(gè)月就過去了,現(xiàn)在補(bǔ)起來,慚愧慚愧。 阮一峰的《ES6標(biāo)準(zhǔn)入門》這本書有300頁左右,除了幾個(gè)新的API和js語法的擴(kuò)展,真正有價(jià)值的內(nèi)容并不多。所謂存在即合理,每部分的...
摘要:塊級(jí)作用域存在于函數(shù)內(nèi)部塊中字符和之間的區(qū)域和塊級(jí)聲明用于聲明在指定塊的作用域之外無法訪問的變量。和都是塊級(jí)聲明的一種。值得一提的是聲明不允許修改綁定,但允許修改值。這意味著當(dāng)用聲明對(duì)象時(shí)沒有問題報(bào)錯(cuò)臨時(shí)死區(qū)臨時(shí)死區(qū),簡(jiǎn)寫為。 塊級(jí)作用域的出現(xiàn) 通過 var 聲明的變量存在變量提升的特性: if (condition) { var value = 1; } console.lo...
閱讀 3021·2023-04-25 18:00
閱讀 2222·2021-11-23 10:07
閱讀 4060·2021-11-22 09:34
閱讀 1249·2021-10-08 10:05
閱讀 1572·2019-08-30 15:55
閱讀 3435·2019-08-30 11:21
閱讀 3339·2019-08-29 13:01
閱讀 1378·2019-08-26 18:26