1. 程式人生 > >let和const命令

let和const命令

一:let

(1)暫時性死區

var tmp = 123;
	if(true){
		console.log(tmp); //123
	}
let tmp =123;
    if(true){
    	console.log(tmp); //123
    }
var tmp =123;
    if(true){
    	console.log(tmp); //123
    	var tmp;
    }
   var tmp =123;
    if(true){
    	console.log(tmp); //未定義
    	let tmp;
    }

let保留js裡面內部變數可以訪問外部變數的權利,但是在es6裡面更加註重的是區域性作用域。

對於上面的前兩個例子裡面我們可以看到無論是js裡面的var還是es裡面的let用宣告變數,其中的內部作用域都可以訪問。

但是對於其中的第三,四例子可以看出來:es6裡面的let更加註重的是區域性作用域。利用let的話存在暫時性死區.我們可以看到如果在一個區域性作用域和全域性作用域同時宣告一個變數,這個時候內部的就不能去訪問外面變數的值。ps對於js裡面利用var來宣告變數會存在變數提升的但是咋內部作用域裡面還是不能訪問的更不用說全域性和區域性的同名變數都用let來進行宣告並賦值了。

利用官方的話來說:暫時性死區的本質就是隻要進入當前作用域,所要的變數已經存在了,但是不能獲取只有等到變數宣告的那一行出現才能夠獲取和使用變數。

(2)不存在變數提升

對於js裡面的變數提升在這裡不再多做強調,這裡需要強調的是let不存在變數提升,下面看一個例子:

   console.log(q); //報錯
    let q;

    console.log(b); //undefined
    var b;

(3)不允許重複宣告變數ps這裡不僅僅說的是用let宣告的重複,和var宣告的也不能重複。ps內層作用域裡面可以宣告和全域性作用域的同名變數

 let a;
    let a; //Identifier 'a' has already been declared
   var a;
    let a; //Identifier 'a' has already been declared
 var a;
    if(true){
    	let a=6;
    	console.log(a); //6
    }

(4)塊級作用域

  塊級作用域存在改變了內部變數覆蓋外層變數用來計數的迴圈變數洩露為全域性變數

下面來看兩個例子:

 function f(){
    	let n ="a";
    	if(true){
    		let n="b";
    	}
    	console.log(n); //a
    }
    f();
function f(){
    	var n ="a";
    	if(true){
    		var n="b";
    	}
    	console.log(n); //b
    }
     f();

因為塊級作用域的存在改變因為變數提升造成的內部變數覆蓋全域性變數

 for (var i = 5; i <4; i++) {
    	console.log(i);
    }
    console.log(i);//5
for (let i = 5; i <4; i++) {
    	console.log(i);
    }
    console.log(i);//報錯

因為塊級作用域的存在改變區域性變數洩露為全域性變數

(二)const

const和let的用法基本相似,但是需要注意的就是const一旦宣告就必須進行賦值而且一旦宣告就不能改變

 const a; // Missing initializer in const declaration
const a=5;
    a=6; // Assignment to constant variable.

塊級作用域有效,不能重複宣告,存在暫時性死區

值不能改變的本質是:地址不變

擴充套件:Object.freeze()將物件凍結。