天天看點

深入javaScript變量聲明

javaScript的變量聲明在ES6之前我們都知道是var a= b; 這簡簡單單的一句話其實js在内部出了以很多東西。在ES6新增了let const語句之後,有讓變量的聲明多了方式。這裡我們就深入一些javaScript的變量聲明;

我們定義一個var a = 1;這一句話其實這裡javaScript在背景可以歸納為完成了三步操作;①建立變量a;在記憶體中開辟一塊區域來存放a;這一步我們用的是var 是有聲明提升的。關于let 和 const官方文檔說的是沒有聲明提升的。但是我們深入發掘就會覺得很奇怪,我們後面在講。②變量a的初始化,初始化為undefined,這一步實在聲明變量之後緊跟着完成的;③變量a的指派,這一步我們程式執行到var a =1;這條語句的時候執行的,是詞法作用域決定的。這裡短短的一句話javaScript就在内部執行了這麼多。

上面是聲明一個沒有的變量的情況,如果是聲明一個已有的變量那麼,javaScript将不會再記憶體中在開辟區域,也不會初始化。如果是單純的聲明并沒有指派那麼變量其實沒有任何變化,如果是生命加指派那麼變量的值将發生變化。

var a =1;
	console.log(a);//1
	var a;
	console.log(a);//1
	var a =2;
	console.log(a);//2      

下來我們說說ES6的let 和 const。let 和 const聲明的都是局部變量,const的聲明的是常量。let 和 const的出現讓javaScript變量的聲明更加的嚴謹和嚴格。let 和 const對聲明的變量十分的挑剔,首先必須在同一個塊級作用域中必須是第一次聲明,如果之前聲明過就會報錯,而且聲明之後在同一個塊級作用域中就不能再次聲明,不然也會報錯。不同塊級作用域中的變量互相是不影響的。這解決了以前for循環輸入1-10 但每次都是10的問題。因為每次在for循環的循環體内部都聲明了一個let 變量。是以值是不同的。這些知識es入門都有詳情解答。

我們這裡來看一下let和const和var聲明在javaScript内部有什麼差別;

其實在ES6很早之前的官方文檔其實寫的let和const的是存在聲明提升的的,但是後來改了。我們看出他們内部一定經過了激烈的讨論我們來看一下代碼;

var c=1;
	{
  	  console.log(c) //Uncaught ReferenceError: c is not defined
   	 let c = 2;
	}      

         這種現象官方文檔叫做“暫時性死區”。在一個塊級作用域内我們必須在使用let建立一個對象之後才能使用。從作用域開始到聲明之前這塊區域就叫做“暫時性死區”。其實這裡c在塊級作用域内的let c是聲明提升了得,不然我們應該通路到的是外層的c變量。但是雖然建立提升了,但是沒有初始化。我們知道在一個var a = 1;之前通路a,傳回的是undefined。但是let 和 const 并沒有初始化為undefined的這一步,隻有執行到let c =2 這一步才初始化c的值。是以在“{"到let c=2這塊區域内c是沒有任何值得。也就是”暫時性死區“是以我們看到let和const其實是有”聲明提升“的。

是以let 和const聲明一個變量隻用2步:①建立變量(在作用于内提升)②初始化(在執行到聲明的地方);

我們在書寫javaScript時應該盡量用到let和const 。别看這一點改變,這會讓我們代碼更健壯,也會避免不必要的錯誤。

繼續閱讀