ECMAScript6學(xué)習(xí)筆記-D1 let命令

@ (2017年7月11日) [馬克飛象 | Markdown格式]
ECMAScript 6:ECMAScript 6(以下簡稱ES6)是JavaScript語言的下一代標(biāo)準(zhǔn),正處在快速開發(fā)之中,大部分已經(jīng)完成了,預(yù)計(jì)將在2015年6月正式發(fā)布。ES6的目標(biāo),是使得JavaScript語言可以用來編寫大型的復(fù)雜的應(yīng)用程序,成為企業(yè)級(jí)開發(fā)語言。
ECMAScript和JavaScript的關(guān)系 :前者是后者的規(guī)格,后者是前者的一種實(shí)現(xiàn)(另外的 ECMAScript 方言還有 Jscript 和 ActionScript)。日常場合,這兩個(gè)詞是可以互換的;

es6 babel轉(zhuǎn)碼器安裝配置


cfcb7e49b9a6d2d6d234d904c6da5a17.png

let命令
let命令: 聲明變量,用法類似于var,但let聲明的變量,只在let命令所在的代碼塊內(nèi)有效。

let和var
{ let a = 10; var b = 1;}console.log(a); // ReferenceError: a is not defined.console.log(b); // 1

let命令和for循環(huán)
**用let聲明的計(jì)數(shù)器i **只在for循環(huán)體內(nèi)有效。

let arr = [1,2,3,4,5,6];for(let i = 0; i < arr.length; i++){ console.log(i);}console.log(i);//ReferenceError: i is not defined

使用var,最后輸出的是9

var a = [];for (var i = 0; i < 10; i++) { var c = i; a[i] = function () { console.log(c); };}a[6](); // 9

使用let,聲明的變量僅在塊級(jí)作用域內(nèi)有效,最后輸出的是6

var a = [];for (var i = 0; i < 10; i++) { let c = i; a[i] = function () { console.log(c); };}a[6](); // 6

let不會(huì)發(fā)生“變量提升”現(xiàn)象
代碼如下:

function do_something() { console.log(foo); // ReferenceError let foo = 2; console.log(foo);//2}do_something();

暫時(shí)性死區(qū)
只要塊級(jí)作用域內(nèi)存在let命令,它所聲明的變量就“綁定”(binding)這個(gè)區(qū)域,不再受外部的影響。

var tmp = 123;if (true) { tmp = 'abc'; // ReferenceError let tmp;}
**注意:**ES6明確規(guī)定,如果區(qū)塊中存在let和const命令,這個(gè)區(qū)塊對(duì)這些命令聲明的變量,從一開始就形成了封閉作用域。凡是在聲明之前就使用這些變量,就會(huì)報(bào)錯(cuò)。

總之,在代碼塊內(nèi),使用let命令聲明變量之前,該變量都是不可用的。這在語法上,稱為“暫時(shí)性死區(qū)”(temporal dead zone,簡稱 TDZ)

if (true) { // TDZ開始 tmp = 'abc'; // ReferenceError console.log(tmp); // ReferenceError let tmp; // TDZ結(jié)束 console.log(tmp); // undefined tmp = 123; console.log(tmp); // 123}

上面代碼中,在let命令聲明變量tmp之前,都屬于變量tmp的“死區(qū)”?!皶簳r(shí)性死區(qū)”也意味著typeof不再是一個(gè)百分之百安全的操作。
typeof x; // ReferenceErrorlet x;//變量x使用let命令聲明,所以在聲明之前,都屬于x的“死區(qū)”,只要用到該變量就會(huì)報(bào)錯(cuò)。因此,typeof運(yùn)行時(shí)就會(huì)拋出一個(gè)ReferenceError。//但是,如果一個(gè)變量根本沒有被聲明,使用typeof反而不會(huì)報(bào)錯(cuò)。typeof undeclared_variable // "undefined"

有些“死區(qū)”比較隱蔽,不太容易發(fā)現(xiàn)。

function bar(x = y, y = 2) { return [x, y];}bar(); // 報(bào)錯(cuò):y is not defined//正確的:function bar(x = 2, y = x) { return [x, y];}bar(); // [2, 2]//另外var x = x; // 不報(bào)錯(cuò)let x = x; // 報(bào)錯(cuò) ReferenceError: x is not defined

ES6 規(guī)定暫時(shí)性死區(qū)和let、const語句不出現(xiàn)變量提升,主要是為了減少運(yùn)行時(shí)錯(cuò)誤,防止在變量聲明前就使用這個(gè)變量,從而導(dǎo)致意料之外的行為。這樣的錯(cuò)誤在 ES5 是很常見的,現(xiàn)在有了這種規(guī)定,避免此類錯(cuò)誤就很容易了??傊瑫簳r(shí)性死區(qū)的本質(zhì)就是,只要一進(jìn)入當(dāng)前作用域,所要使用的變量就已經(jīng)存在了,但是不可獲取,只有等到聲明變量的那一行代碼出現(xiàn),才可以獲取和使用該變量。

let不允許在相同作用域內(nèi),重復(fù)聲明同一個(gè)變量

// 報(bào)錯(cuò){ let a = 10; var a = 1;}// 報(bào)錯(cuò){ let a = 10; let a = 1;}//報(bào)的錯(cuò)是 Uncaught SyntaxError: Identifier 'a' has already been declared
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容