ECMAScript6-let和const命令

大致介紹
ES6是下一代的JavaScript語言的標(biāo)準(zhǔn),目標(biāo)是讓JavaScript可以用來編寫大型的復(fù)雜程序螟蒸,成為企業(yè)級(jí)開發(fā)語言,要查看瀏覽器對(duì)ES6的支持程度可以用阮一峰大佬寫的工具ES-Checker
安裝:(需要安裝npm(心累),推薦用cnpm)
npm install -g es-checker
es-checker
效果(有具體的支持情況):


let
let命令,和var的作用一樣掉缺,都是用來聲明變量,只是let命令只在所在的代碼塊內(nèi)有效
經(jīng)典的例子:

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

經(jīng)典的例子戈擒,就不贅述眶明,這里a數(shù)組都是引用的同一個(gè)i
改用 let:

var a = [];
for(let i=0;i<10;i++){
a[i] = function(){
console.log(i);
}
}
a[4](); //4
console.log(i); // ReferenceError: i is not defined

這里i用let聲明,就只在本次循環(huán)中存在筐高,每次循環(huán)都會(huì)創(chuàng)建一個(gè)i
注意:在for循環(huán)中赘来,循環(huán)語句是一個(gè)作用域,而循環(huán)體內(nèi)部又是一個(gè)子作用域
例如:

for(let i=0;i<3;i++){
let i = 'abd';
console.log(i);
}
//abd
//abd
//abd

可以看出循環(huán)體內(nèi)的i和循環(huán)語句中的i是分離的
let的特點(diǎn)
1凯傲、不存在變量提升

console.log(a);//undefinedvara = '123';
console.log(b);
let b= '123';//ReferenceError: b is not defined

2犬辰、暫時(shí)性死區(qū)
如果在一個(gè)塊級(jí)作用域內(nèi)有l(wèi)et命令,那他聲明的變量就綁定這個(gè)塊級(jí)作用域冰单,不受外部的影響

var a = '123';
if(true){
a = '456';
console.log(a); //ReferenceError: a is not defined
let a;
console.log(a); //undefined
}

ES6明確規(guī)定幌缝,如果區(qū)塊中存在let或者const命令,這個(gè)區(qū)塊對(duì)這些命令聲明的變量诫欠,從一開始就形成封閉作用域涵卵,凡是在聲明之前使用這些變量都會(huì)報(bào)錯(cuò)
這里a是用let聲明的,所以在let聲明之前使用a都會(huì)報(bào)錯(cuò)
3荒叼、不能重復(fù)聲明
let不允許在同一個(gè)作用域內(nèi)轿偎,聲明同一個(gè)變量

//報(bào)錯(cuò)
{
var a = '123';
let a = '456';
}
//報(bào)錯(cuò)
{
let a = '123';
var a = '456';
}
//報(bào)錯(cuò)
{
let a = '123';
let a = '123';
}

注意:在函數(shù)內(nèi)不能重復(fù)聲明參數(shù)

//報(bào)錯(cuò)
function test(target) {
let target;
}
//不報(bào)錯(cuò)
function test(target){
{
let target;
}
}

在第二個(gè)函數(shù)里不報(bào)錯(cuò),是應(yīng)為{}中時(shí)一個(gè)新的子作用域被廓,和參數(shù)target不是在同一個(gè)塊內(nèi)了
塊級(jí)作用域
let為JavaScript新增了塊級(jí)作用域
使用var是沒有塊作用域概念的

var a = '123';
if(true){
var a = '456';
}
console.log(a); //456

使用let就有了塊作用域

let a = '123';
if(true){
let a = '456';
}
console.log(a); //123

外層的代碼塊不受內(nèi)層代碼塊的影響
塊級(jí)作用域和函數(shù)聲明
ES5規(guī)定函數(shù)只能在頂層作用域和函數(shù)作用域中聲明坏晦,不能在塊作用域中聲明
ES6 引入了塊級(jí)作用域,明確允許在塊級(jí)作用域之中聲明函數(shù)嫁乘。ES6 規(guī)定昆婿,塊級(jí)作用域之中,函數(shù)聲明語句的行為類似于let蜓斧,在塊級(jí)作用域之外不可引用仓蛆。
例如:

function f(){
console.log('out');
}
(function(){
if(false){
function f(){
console.log('in')
};
};
f();
}());

在ES5中結(jié)果是 'in'。就是函數(shù)聲明提升挎春,不在多贅述
在ES6中看疙,理想的結(jié)果是'out'豆拨,但是在瀏覽器中運(yùn)行時(shí),卻會(huì)報(bào)錯(cuò)能庆,這是為什么辽装?因?yàn)槿绻@么突兀,那么老的代碼就會(huì)出現(xiàn)很多的問題相味,所以拾积,ES6規(guī)定瀏覽器可以有自己的的行為方式
1、允許在塊級(jí)作用域內(nèi)聲明函數(shù)丰涉。
2拓巧、函數(shù)聲明類似于var,即會(huì)提升到全局作用域或函數(shù)作用域的頭部一死。
3肛度、同時(shí),函數(shù)聲明還會(huì)提升到所在的塊級(jí)作用域的頭部投慈。
注意承耿,上面三條規(guī)則只對(duì) ES6 的瀏覽器實(shí)現(xiàn)有效,其他環(huán)境的實(shí)現(xiàn)不用遵守伪煤,還是將塊級(jí)作用域的函數(shù)聲明當(dāng)作let處理加袋。
在ES6中實(shí)際執(zhí)行的代碼是

function f(){
console.log('out');
}
(function(){
var f = undefined;
if(false){
function f(){
console.log('in')
};
};
f();
}());

注意:ES6 的塊級(jí)作用域允許聲明函數(shù)的規(guī)則,只在使用大括號(hào)的情況下成立抱既,如果沒有使用大括號(hào)职烧,就會(huì)報(bào)錯(cuò)。

// 不報(bào)錯(cuò)
'use strict';
if (true) {
function f() {}
}
// 報(bào)錯(cuò)
'use strict';
if (true)
function f() {}

const命令
const聲明一個(gè)只讀的常量防泵,一旦聲明蚀之,常量的值就不能改變。所以在使用const時(shí)捷泞,一旦聲明就要立即初始化
const和let一樣足删,只存在與本塊作用域中,沒有聲明提升锁右,存在暫時(shí)性死區(qū)失受,不可重復(fù)聲明
const實(shí)際上保證的,并不是變量的值不得改動(dòng)骡湖,而是變量指向的那個(gè)內(nèi)存地址不得改動(dòng)贱纠。對(duì)于簡(jiǎn)單類型的數(shù)據(jù)(數(shù)值峻厚、字符串响蕴、布爾值),值就保存在變量指向的那個(gè)內(nèi)存地址惠桃,因此等同于常量浦夷。但對(duì)于復(fù)合類型的數(shù)據(jù)(主要是對(duì)象和數(shù)組)辖试,變量指向的內(nèi)存地址,保存的只是一個(gè)指針劈狐,const只能保證這個(gè)指針是固定的罐孝,至于它指向的數(shù)據(jù)結(jié)構(gòu)是不是可變的,就完全不能控制了肥缔。因此莲兢,將一個(gè)對(duì)象聲明為常量必須非常小心。
例如:

const a = {
id: 1,
name:'qqqq'
};
a.id = 2;
a = {}; //報(bào)錯(cuò)

參考資料:
ECMAScript 6入門-阮一峰
博客地址:www.cnblogs.com/qqandfqr

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末续膳,一起剝皮案震驚了整個(gè)濱河市改艇,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌坟岔,老刑警劉巖谒兄,帶你破解...
    沈念sama閱讀 216,651評(píng)論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異社付,居然都是意外死亡承疲,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,468評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門鸥咖,熙熙樓的掌柜王于貴愁眉苦臉地迎上來燕鸽,“玉大人,你說我怎么就攤上這事啼辣∶嘣郏” “怎么了?”我有些...
    開封第一講書人閱讀 162,931評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵熙兔,是天一觀的道長(zhǎng)悲伶。 經(jīng)常有香客問我,道長(zhǎng)住涉,這世上最難降的妖魔是什么麸锉? 我笑而不...
    開封第一講書人閱讀 58,218評(píng)論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮舆声,結(jié)果婚禮上花沉,老公的妹妹穿的比我還像新娘。我一直安慰自己媳握,他們只是感情好碱屁,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,234評(píng)論 6 388
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著蛾找,像睡著了一般娩脾。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上打毛,一...
    開封第一講書人閱讀 51,198評(píng)論 1 299
  • 那天柿赊,我揣著相機(jī)與錄音俩功,去河邊找鬼。 笑死碰声,一個(gè)胖子當(dāng)著我的面吹牛诡蜓,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播胰挑,決...
    沈念sama閱讀 40,084評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼蔓罚,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了瞻颂?” 一聲冷哼從身側(cè)響起脚粟,我...
    開封第一講書人閱讀 38,926評(píng)論 0 274
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎蘸朋,沒想到半個(gè)月后核无,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,341評(píng)論 1 311
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡藕坯,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,563評(píng)論 2 333
  • 正文 我和宋清朗相戀三年团南,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片炼彪。...
    茶點(diǎn)故事閱讀 39,731評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡吐根,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出辐马,到底是詐尸還是另有隱情拷橘,我是刑警寧澤,帶...
    沈念sama閱讀 35,430評(píng)論 5 343
  • 正文 年R本政府宣布喜爷,位于F島的核電站冗疮,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏檩帐。R本人自食惡果不足惜术幔,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,036評(píng)論 3 326
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望湃密。 院中可真熱鬧诅挑,春花似錦、人聲如沸泛源。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,676評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽达箍。三九已至没龙,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背兜畸。 一陣腳步聲響...
    開封第一講書人閱讀 32,829評(píng)論 1 269
  • 我被黑心中介騙來泰國打工努释, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留碘梢,地道東北人咬摇。 一個(gè)月前我還...
    沈念sama閱讀 47,743評(píng)論 2 368
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像煞躬,于是被迫代替她去往敵國和親肛鹏。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,629評(píng)論 2 354

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