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