大致介紹
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