也是用來聲明變量,可是不一樣於var,我的理解是它是用來修復var的一些神奇效果,似的變量更加規範,簡單來講let定義的變量就是私有變量,有如下幾點做用安全
if (true) { let i; console.log(i); } //console.log(i); ReferenceError: i is not defined
let聲明的i外部不能被訪問閉包
for (let i = 0; i < 4; i ++) { console.log(i); } console.log(i); //i is not defined
之因此裏面能訪問i,由於for循環子做用域能訪問外部做用code
for循環當在子做用域,聲明let i時與循環體i是獨立的對象
for (let i = 0; i < 4; i ++) { let i = 6; console.log(i); }
爲何能,簡單說就是i私有了內存
每次循環let都是從新申明的,正由於這樣,就能解決for循環時閉包帶來的問題作用域
for (let i = 0; i < 4; i ++) { setTimeout(function () {console.log(i)}, 100) } //0 1 2 3 for (var i = 0; i < 4; i ++) { setTimeout(function () {console.log(i)}, 100) } //4 4 4 4
不存在變量提高,io
//console.log(i); //console.log(typeof i); let i;
都是會報錯的,i is not defined。
對於let聲明的變量,typeof 再也不是安全形式了,而且該變量必須在聲明後才能使用,在它以前使用那就是暫時的死區console
function f(x=y,y=2) {}; f(); //y is not defined let x = x; //x is not defined
同一做用域中也不能重複定義for循環
let i; let i; //報錯
function f(n) { let n } f(); //報錯
不一樣做用域能夠重複且各自獨立function
function f(n) { {let n} }
let聲明的變量不屬於window
let i = 1; console.log(window.i); //undefined
做用和let同樣,但多兩點
一旦聲明必須初始化,也就是必需賦值,不然報錯;
const P = 1;
一旦賦值不能被改變,其本質是不能改變變量的內存地址
變量是原始類型的數據,其自己就是不可變的,再加上不能從新賦值,改變地址
const P = 1; P = 2; //報錯
變量是對象類型的,其自己是可變的,因此也就能改變,要注意的是其地址並不改變
const P = {a : 1} ; P.a =2; console.log(P); //{a : 2}
想要其內容也不變,能夠凍結它
const P = {a : 1} ; Object.freeze(P); P.a =2; console.log(P);