從var 到 let,JS 用了整整18年!

一我的的成功啊,不只要靠我的的努力,還要考慮到歷史的進程。web

18年?

看初版的ECMA:1997年編程

看看支持let的版本:2015年編程語言

很難想象,只是一個語言特性的改版,居然會用18年的時間,因此啊,一我的的成功,不只要靠我的的努力,還要考慮到歷史的進程,對於一門語言一樣的適用。 不少人吐槽JS的不少缺陷,我以爲這不能怪 布蘭登·艾克,由於一開始,就沒想着JS可以作多大的事兒,就是一門簡單的腳本語言,可以實現一些簡單功能就能夠了。後來互聯網的日益繁榮,web的重視,才使得JavScript被委以重任,這也就要求JavaScript 變得愈來愈正式化,愈來愈是一門正真的編程語言。函數

從var提及

聲明前置

var 用於聲明一個變量,可是你須要注意到一些這種變量聲明的奇怪特性,就是 聲明前置3d

上面的代碼中,第一行使用了變量 a,在c語言中,還沒聲明一個變量就使用,是會直接報錯的,但在JS中不會,而是會輸出 undefined 這就是聲明前置。上面的代碼,至關於:code

做用域

在ES6以前,你要知道,只有全局做用域和函數做用域cdn

在函數裏面聲明一個變量,在函數外部訪問會報錯:blog

若是像c語言同樣寫寫塊級做用域呢:進程

小結:var存在缺陷,聲明前置,做用域的問題,不像一個編程語言該有的變量聲明。ip

let的魔法

1. 暫時性死區

先使用,後定義會報錯,不會再像var 那樣隨意:

這是否是就說明了let 聲明的變量不會被前置呢?不少人認爲let不會被提高,實際上不是這樣的,再看一個例子:

那麼到底是怎麼回事呢?這就被稱爲 暫時性死區:就是指 let聲明的變量必須先聲明並初始化成功後才能被引用,不然,這個變量就不能被引用,進入了暫存死區,就跟死了同樣。

2. 塊級做用域

不會再像 var同樣,let聲明的變量是有本身獨立的做用域的。

因此, let聲明的變量只在本身的代碼塊中有效,即let聲明的變量就是局部變量。

3. 重複聲明

重複聲明:

在塊中重複聲明:

在兩個塊中分別聲明:

從新賦值:

因此,當在同一個做用域內,使用let重複聲明,是會報錯的,可是能夠被從新賦值。

4. 不會做爲window 的屬性

var 聲明的全局變量:

let 聲明的全局變量:

const 聲明一個量

const這也是ES6新增的語法,它是用於聲明一個常量的,這個常量的值不可被修改。

聲明一個常量

使用const 時必需要同時指定這個常量的值,不然會報錯。

const的做用域

const聲明的常量的做用域也是塊級做用域,和let同樣。

const 的值不可被修改

const聲明建立一個值的只讀引用。但這並不意味着它所持有的值是不可變的,只是變量標識符不能從新分配。

  • 對於簡單數據類型,值就保存在變量指向的那個內存地址。
  • 對於複合類型的數據,變量指向的內存地址,時這個地址不可被修改,至於指向的實際的數據,是能夠被修改的。

總結

let 總結

  • let聲明的變量存在暫時性死區,建立過程存在提高,初始化過程不會被提高。
  • let聲明的變量具備塊級做用域
  • let聲明的變量不容許重複聲明
  • let聲明的變量不會做爲window的屬性

const 總結

  • 聲明時必需要初始化一個值
  • 常量值不可更改
  • 其餘和let特性同樣

JS這門語言的發展是順應歷史的發展,只是JS開發者,會感到心累,由於,在舊版本還須要繼續維護,不可以果斷放棄,我想說,前人栽樹,後人呵護。

相關文章
相關標籤/搜索