昨天介紹了,JS中函數的做用域html
什麼詞法環境之類的,可能不少小夥伴不太明白。閉包
在今天的內容開始以前,先作個簡短的聲明:函數
詞法環境這一律念是在ES5中提出的,由於詞法環境主要用於保存let、const聲明的變量、函數spa
而在ES3中對變量相關的信息都保存在變量對象上;設計
從功能上來講變量對象能夠看做是詞法環境中的環境記錄htm
二者從功能上來講區別不大,只是不一樣版本的ES有不一樣的說法對象
爲了保持與前文的一致,這篇文章中我仍是用環境記錄來描述JS保存當前執行環境(上下文)中定義的變量和函數的對象blog
ES6以前JS中的做用域只有全局做用域和局部做用域(函數做用域)兩種,後文將基於此進行解釋作用域
做用域聯繫前文咱們能夠理解爲執行環境(上下文)中的詞法環境get
而每一個做用域都由一個保存變量的對象(環境記錄)和一個指向外部詞法環境的outer(對外部環境引用)構成
做用域之間的嵌套關係由outer來維護
一個個做用域經過outer造成的鏈式結構就被稱做做用域鏈
在《js高級程序設計》中把執行棧頂端的執行環境(上下文)中的做用域(詞法環境)稱爲活動對象
那麼做用域鏈是幹嗎的呢?
做用域鏈就是讓咱們能在子做用域中訪問父做用域鏈中的變量的
在解釋做用域的時候我提過,每一個做用域都包含了一個對外部做用域的引用,這個引用是單向的
這也是子做用域能訪問父做用域,而父做用域不能訪問子做用域的緣由
當咱們在使用變量的時候,JS會解析標識符,解析實際上就是一個沿着做用域鏈一層層搜索標識符的過程
在搜索標識符這一過程當中,只要搜索到符合的標識符就會當即中止搜索
這也就是當父級做用域和子做用域有同名變量時,JS以子做用域中的爲準的緣由
在JS中除了函數以外,還有一些語句也會產生做用域,從而延長做用域
1.try-catch中的catch會產生一個新的做用域
2.with語句 會將指定對象做爲做用域添加到執行棧的頂端
在使用上方的語句時須要注意一下
PS . IE8 以前的JS版本中catch會將錯誤對象添加到當前的執行環境的變量對象中,而不是新建一個,IE9中修復了該bug
在ES6以前JS是沒有塊級做用域的,也就是大括號之間的代碼塊不會產生一個獨立的做用域
也就是說花括號中間聲明的變量會添加到當前的執行環境中
這也是for循環中聲明的 i 在外部也能訪問的緣由
最近的文章可能都沒有什麼例子的配合了,一是有些東西實在很差舉例,二是本身水平有限
望諒解,JS中的閉包等問題會在後面介紹object裏面的function類型的時候介紹