Javascript高級編程學習筆記(10)—— 做用域、做用域鏈

昨天介紹了,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類型的時候介紹

相關文章
相關標籤/搜索