一我的的成功啊,不只要靠我的的努力,還要考慮到歷史的進程。web
看初版的ECMA:1997年編程
看看支持let的版本:2015年編程語言
很難想象,只是一個語言特性的改版,居然會用18年的時間,因此啊,一我的的成功,不只要靠我的的努力,還要考慮到歷史的進程,對於一門語言一樣的適用。 不少人吐槽JS的不少缺陷,我以爲這不能怪 布蘭登·艾克,由於一開始,就沒想着JS可以作多大的事兒,就是一門簡單的腳本語言,可以實現一些簡單功能就能夠了。後來互聯網的日益繁榮,web的重視,才使得JavScript被委以重任,這也就要求JavaScript 變得愈來愈正式化,愈來愈是一門正真的編程語言。函數
var
用於聲明一個變量,可是你須要注意到一些這種變量聲明的奇怪特性,就是 聲明前置。3d
上面的代碼中,第一行使用了變量 a
,在c語言中,還沒聲明一個變量就使用,是會直接報錯的,但在JS
中不會,而是會輸出 undefined
這就是聲明前置。上面的代碼,至關於:code
在ES6以前,你要知道,只有全局做用域和函數做用域。cdn
在函數裏面聲明一個變量,在函數外部訪問會報錯:blog
若是像c語言同樣寫寫塊級做用域呢:進程
小結:var
存在缺陷,聲明前置,做用域的問題,不像一個編程語言該有的變量聲明。ip
先使用,後定義會報錯,不會再像var
那樣隨意:
這是否是就說明了let
聲明的變量不會被前置呢?不少人認爲let
不會被提高,實際上不是這樣的,再看一個例子:
let
聲明的變量必須先聲明並初始化成功後才能被引用,不然,這個變量就不能被引用,進入了暫存死區,就跟死了同樣。
不會再像 var
同樣,let
聲明的變量是有本身獨立的做用域的。
因此, let
聲明的變量只在本身的代碼塊中有效,即let
聲明的變量就是局部變量。
重複聲明:
在塊中重複聲明:
在兩個塊中分別聲明:
從新賦值:
因此,當在同一個做用域內,使用let
重複聲明,是會報錯的,可是能夠被從新賦值。
var
聲明的全局變量:
let
聲明的全局變量:
const
這也是ES6新增的語法,它是用於聲明一個常量的,這個常量的值不可被修改。
聲明一個常量
使用const
時必需要同時指定這個常量的值,不然會報錯。
const的做用域
const
聲明的常量的做用域也是塊級做用域,和let
同樣。
const 的值不可被修改
const
聲明建立一個值的只讀引用。但這並不意味着它所持有的值是不可變的,只是變量標識符不能從新分配。
let
聲明的變量存在暫時性死區,建立過程存在提高,初始化過程不會被提高。let
聲明的變量具備塊級做用域let
聲明的變量不容許重複聲明let
聲明的變量不會做爲window
的屬性let
特性同樣JS這門語言的發展是順應歷史的發展,只是JS開發者,會感到心累,由於,在舊版本還須要繼續維護,不可以果斷放棄,我想說,前人栽樹,後人呵護。