自學es6中let、const總結篇

今天沒有任務了,leader看了我的編碼風格,給我的建議就是多實踐,夯實基礎,所以列了一些內容讓我來看。首先我又看了let,const的內容,這次又有了很多新的感悟。

let與const都是es6中新出現的語法內容,首先我來回答以下幾個問題

1.爲什麼會提出let和const,他們解決了什麼問題?

在es6之前,es5中的作用域只有全局作用域和函數作用域,而聲明變量只能是var,而使用var聲明的變量會有一些問題,第一個問題就是導致用於計數的循環變量全局化,即泄露爲全局變量。如下代碼:

var s='hello'

for(var i=0;i<9;I++){

   console.log(s[i])

}

console.log(i)//8

以上代碼其實我們希望循環指針i用完之後,系統自動回收,但是最後的結果卻是for裏的計數變量i在全局生效。

第二個問題是內層變量覆蓋外層變量,如下代碼

var tmp = new Date()

function f(){

   console.log(tmp)

   if(false){

      var tmp = 123

}

}

f();//undefined

該代碼的原意是if外層的代碼使用外層的tmp而If內層的代碼塊使用內部的tmp,但是由於變量提升,內部的變量覆蓋了外層的變量。

其實使用let就可以解決以上問題。

使用let定義的變量不存在變量提升,而且使用let定義的變量不允許在作用域內重複定義,否則會報錯,let定義的變量存在暫時性死區,即只要在有let定義的變量的作用域內,該變量就綁定該作用域,不受外部影響。

二、const

const定義的時一個常量即:

const  i=1;

i=2;//就會報錯

const定義的是常量,該常量的值是不能改變的。在javascrip中,使用const定義的基礎類型的常量,該常量指向的地址中的值是不變的。使用const定義的複雜類型的常量,該常量裏存儲的是一個地址,則表明該地址是不可變的,但是const定義的複雜類型變量裏的數據結構是否可變,那就不能保證了,例如:

const f = {};

f.name = 'yn'

f={}//報錯

注意:const定義的常量必須初始化,不然會報錯。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章