- 塊做用域:ES6中新增長的,只要有{}就是塊做用域,
-
二
-
var與function的區別
var:只提早聲明
function:即聲明又定義
三
let,const的區別
let,
沒有變量提高,
不能夠重複聲明,
定義的變量不會給window增長屬性
const:
沒有變量提高,
不能夠重複聲明,
定義的變量不會給window增長屬性,
定義的是一個常量,定義後不可修改.
一旦聲明必須賦值
變量提高的特殊問題
-
1.自執行函數不會變量提高
2.等號右邊沒有變量提高
3.條件判斷的時候,無論條件是否成立都要變量提高,可是,var,function都是隻聲明不定義,當條件成立第一步先給函數賦值
4.當一個函數當作一個參數的時候不進行變量提高(此時函數已是一個實參了,即便是函數表達式也表明了一個值)
5.函數中,return後面的雖然不執行,但須要變量提高,可是return出的結果是不進行變量提高的
- 私有做用域問題
- 一個函數執行都會造成一個私有做用域,一個函數可執行屢次,每一次都會造成一個私有做用域,每個做用域都沒有關係
- 閉包:一個私有做用域保護裏面的私有變量不受外界干擾
- 私有變量:
1.在私有做用域下聲明過的變量()使用var function,let,const這些關鍵字聲明過的變量
2.形參也是私有變量
- 做用域鏈:
在私有做用域下,遇到變量了,先看看是否是本身的私有變量,若是是,就用本身的私有變量,若是不是,往上一級找,沒有繼續找,一直找到全局做用域爲止,還找不到那就報錯了,這個查找的過程叫做用域鏈
函數的參數也被當作變量來對待,所以訪問規則與執行環境中的其餘變量相同
- 塊級做用域:
1.只要{}包起來的都是塊級做用域
{},if(){},for{}.while(){}
-
2.注意
- function(){} 是私有做用域,不在此中體現
- 在塊級做用域中,使用var與function定義的變量不能夠重名
- 塊級做用域針對let d, const,就至關於私有做用域,外面拿不到裏面的聲明的變量,self.d–undefined
- 暫時性死區:在塊級做用域下,不能夠提早使用未被聲明的變量(使用let和const聲明)
內存銷燬
-
1.堆內存的釋放: 地址不會被覆蓋,而是不指向以前的地址,瀏覽器會自動銷燬原來的不在被變量佔用的地址,
注意:之後開發中後期再也不使用的引用數據類型手動將其賦值爲null
2.棧內存的釋放:
- 不銷燬:當一個私有做用域返回一個地址被外界佔用了,此時這個做用域就不銷燬
循環綁定事件
使用自定義屬性的目的是爲了存儲他的索引值
使用不銷燬的做用域來存儲他的索引值:他的索引當作實參傳給自執行函數,使用私有變量形參來接收,由於這個自執行函數返回一個函數賦值給事件onclick,因此這個自執行函數造成的私有做用域不銷燬,那麼點擊的時候,去找到對應的地址,
擴展運算符
…
- 將非數組(有length.有索引,字符串\arguments,元素集合,classList.類名集合,classlist類名集合,set,Map)變成數組