let 和 const命令
創(chuàng)新互聯(lián)公司堅信:善待客戶,將會成為終身客戶。我們能堅持多年,是因為我們一直可值得信賴。我們從不忽悠初訪客戶,我們用心做好本職工作,不忘初心,方得始終。十年網(wǎng)站建設(shè)經(jīng)驗創(chuàng)新互聯(lián)公司是成都老牌網(wǎng)站營銷服務(wù)商,為您提供網(wǎng)站建設(shè)、網(wǎng)站設(shè)計、網(wǎng)站設(shè)計、H5場景定制、網(wǎng)站制作、成都品牌網(wǎng)站建設(shè)、小程序設(shè)計服務(wù),給眾多知名企業(yè)提供過好品質(zhì)的建站服務(wù)。1 let命令
用法:
ES6新增let命令,用于聲明變量,用法類似var,只是let聲明的變量是塊級作用域內(nèi)有效
例:
{
let a = 10;
var b = 1;
}
a // a is not defined
b // 1
根據(jù)返回值可以看出,let聲明變量時的作用域只在其代碼塊內(nèi)
for 循環(huán)的計數(shù)器就很適合使用let來聲明變量。
var a = [];
for (var i = 0; i<10; i++){
a[i] = function(){
console.log(i);
};
}
a[6]();//10
如果用let聲明變量i;
a[6]();//6
因為let聲明的i只在本輪循環(huán)內(nèi)有效。所以每次循環(huán)的i其實都是新的變量,于是輸出6。
let聲明變量不存在變量提升;
例:
console.log(foo);
let foo = 2;
執(zhí)行會報錯,但是如果用var聲明,得到的結(jié)果就是2。
暫時性死區(qū):
只要塊級作用域內(nèi)存在let命令,它所聲明的變量就“綁定這個區(qū)域”,不受外部影響。
例
var tmp =123 ;
if(true){
tmp = 'abc';
let tmp;
}
報錯,let綁定了if內(nèi)的塊級作用域,在let聲明變量前,對tmp賦值會報錯。
ES6明確規(guī)定,如果區(qū)塊 存在let和const命令,則這個區(qū)塊對這些命令聲明的變量從一開始就形成封閉作用域。
在代碼塊內(nèi),使用let命令聲明變量之前,該變量都是不可用的。語法上稱“暫時性死區(qū)”,簡稱TDZ。
let不允許在相同作用域內(nèi)重復(fù)聲明同一個變量。(這個就不解釋了)
2.塊級作用域到底是個啥
ES5只有函數(shù)作用域和全局作用域,沒有塊級作用域,那么會帶來以下不合理情況:
例1
var tmp = new Date();
funciton f(){
console.log(tmp);
if(false){
var tmp = "hello world";
}
}
f() //undefined;
變量提升內(nèi)層tmp變量覆蓋了外層的tmp變量
例2
for 循環(huán)計數(shù)的變量泄露為全局變量。
ES6的塊級作用域
function f1(){
let n = 5;
if(true){
let n = 10;
}
console.log(n);//5
}
最后輸出5,表明外層代碼不受內(nèi)層代碼塊的影響。如果使用var, 最后的輸出值為10.
ES6允許塊級作用域任意嵌套;
另外ES6規(guī)定,函數(shù)本身作用域在其所在的塊級作用域內(nèi)。
fuction f(){ console.log(1)};
(function (){
function f(){
console.log(2);
}
f();
}());
ES5//2,
ES6//1。
嚴(yán)格模式下,函數(shù)只能在頂層作用域和函數(shù)內(nèi)聲明,其他情況(if,for)下的聲明都會報錯。
3.const命令
const 用來聲明常量。 一旦聲明,其值不可改變。
const 作用域等同于let,只在聲明所在的塊級作用域內(nèi)有效。
const 命令只是保證變量名指向的地址不變,并不保證該地址的數(shù)據(jù)不變,所以將一個對象聲明為常量必須非常小心。
例
const a=[];
a.push("hello");//可執(zhí)行
a.length = 0; //可執(zhí)行
a = ['Dave'];// 報錯。
數(shù)組本身是可寫的,但是要把另一個數(shù)組賦值給a,就會報錯。
如果想讓對面被凍結(jié),本身也不可寫,應(yīng)該使用Object.freeze方法。
ES6一共6中聲明變量的方法:
var function let const import class
4.跨模塊常量
// constants.js 模塊
export const A= 1;
export const B= 3;
export const C= 4;
// test1.js 模塊
import * as constants from './constants';
console.log(constanst.A);//1
console.log(constanst.B);//3
//test2.js模塊
import {A,B} from './constants';
console.log(A);//1
console.log(B);//3
5.全局對象的屬性
ES5:
window.a = 1;
a //1;
a = 2;
window.a //2
ES6:
let b = 1;
window.b // undefined;
ES6規(guī)定 var 命令和function 命令聲明的全局變量依舊是全局對象的屬性
let命令 、 const命令、 class命令聲明的全局變量不屬于全局對象的屬性
另外有需要云服務(wù)器可以了解下創(chuàng)新互聯(lián)scvps.cn,海內(nèi)外云服務(wù)器15元起步,三天無理由+7*72小時售后在線,公司持有idc許可證,提供“云服務(wù)器、裸金屬服務(wù)器、高防服務(wù)器、香港服務(wù)器、美國服務(wù)器、虛擬主機、免備案服務(wù)器”等云主機租用服務(wù)以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡單易用、服務(wù)可用性高、性價比高”等特點與優(yōu)勢,專為企業(yè)上云打造定制,能夠滿足用戶豐富、多元化的應(yīng)用場景需求。