今天沒有任務了,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定義的常量必須初始化,不然會報錯。