ES6學習(一)之var羞芍、let哗戈、const

更多前端文章

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)結束后厨喂,它并沒有消失,泄露成了全局變量庄呈。

  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ù)結構是不是可變的,就完全不能控制了

那么我們想得到不可修改的const要怎么做呢甘穿?應該使用Object.freeze方法腮恩。

const foo = Object.freeze({});

// 常規(guī)模式時,下面一行不起作用温兼;
// 嚴格模式時,該行會報錯
foo.prop = 123;
// 除了將對象本身凍結武契,對象的屬性也應該凍結募判。
var constantize = (obj) => {
  Object.freeze(obj);
  Object.keys(obj).forEach( (key, i) => {
    if ( typeof obj[key] === 'object' ) {
      constantize( obj[key] );
    }
  });
};

參考文章
ECMAScript 6 入門

?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市咒唆,隨后出現(xiàn)的幾起案子届垫,更是在濱河造成了極大的恐慌,老刑警劉巖全释,帶你破解...
    沈念sama閱讀 212,454評論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件装处,死亡現(xiàn)場離奇詭異,居然都是意外死亡浸船,警方通過查閱死者的電腦和手機妄迁,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,553評論 3 385
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來李命,“玉大人登淘,你說我怎么就攤上這事》庾郑” “怎么了黔州?”我有些...
    開封第一講書人閱讀 157,921評論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長阔籽。 經(jīng)常有香客問我流妻,道長,這世上最難降的妖魔是什么笆制? 我笑而不...
    開封第一講書人閱讀 56,648評論 1 284
  • 正文 為了忘掉前任绅这,我火速辦了婚禮,結果婚禮上项贺,老公的妹妹穿的比我還像新娘君躺。我一直安慰自己峭判,他們只是感情好,可當我...
    茶點故事閱讀 65,770評論 6 386
  • 文/花漫 我一把揭開白布棕叫。 她就那樣靜靜地躺著林螃,像睡著了一般。 火紅的嫁衣襯著肌膚如雪俺泣。 梳的紋絲不亂的頭發(fā)上疗认,一...
    開封第一講書人閱讀 49,950評論 1 291
  • 那天,我揣著相機與錄音伏钠,去河邊找鬼横漏。 笑死,一個胖子當著我的面吹牛熟掂,可吹牛的內(nèi)容都是我干的缎浇。 我是一名探鬼主播,決...
    沈念sama閱讀 39,090評論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼赴肚,長吁一口氣:“原來是場噩夢啊……” “哼素跺!你這毒婦竟也來了?” 一聲冷哼從身側響起誉券,我...
    開封第一講書人閱讀 37,817評論 0 268
  • 序言:老撾萬榮一對情侶失蹤指厌,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后踊跟,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體踩验,經(jīng)...
    沈念sama閱讀 44,275評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,592評論 2 327
  • 正文 我和宋清朗相戀三年商玫,在試婚紗的時候發(fā)現(xiàn)自己被綠了箕憾。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,724評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡决帖,死狀恐怖厕九,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情地回,我是刑警寧澤扁远,帶...
    沈念sama閱讀 34,409評論 4 333
  • 正文 年R本政府宣布,位于F島的核電站刻像,受9級特大地震影響畅买,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜细睡,卻給世界環(huán)境...
    茶點故事閱讀 40,052評論 3 316
  • 文/蒙蒙 一谷羞、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦湃缎、人聲如沸犀填。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,815評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽九巡。三九已至,卻和暖如春蹂季,著一層夾襖步出監(jiān)牢的瞬間冕广,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,043評論 1 266
  • 我被黑心中介騙來泰國打工偿洁, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留撒汉,地道東北人。 一個月前我還...
    沈念sama閱讀 46,503評論 2 361
  • 正文 我出身青樓涕滋,卻偏偏與公主長得像睬辐,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子宾肺,可洞房花燭夜當晚...
    茶點故事閱讀 43,627評論 2 350

推薦閱讀更多精彩內(nèi)容