做用域是變量和函數生效的區域。分爲全局變量和局部變量。函數外面不能訪問函數裏面的,函數裏面的能夠訪問函數外面的。彼此獨立的區間不能互相訪問。 每一個js的函數都是一個對象,對象有些屬性咱們能夠訪問,有些只能供js引擎存取,咱們訪問不了。[[scope]]就是其中之一。scope就是咱們所說的做用域,其中存儲了執行期上下文的集合。這個集合成鏈式結構,咱們把這個連式結構稱做做用域鏈。 當函數執行的前一刻,會建立一個稱爲執行期上下文的內部對象。一個執行期上下文定義一個函數執行環境,函數每次執行對應的執行上下文都是獨一無二的。因此屢次調用一個函數會致使建立多個執行期上下文,當函數執行完畢時候,執行期上下文就會被銷燬。數組
預編譯分爲函數預編譯和全局預編譯 預編譯總共有四個步驟,第一個先建立一個AO對象(activation object),也叫做執行期上下文。第二個找到形參和變量聲明,將變量和形參名做爲AO的屬性,值爲undefined。第三部是實參和形參相統一,把實參值傳到形參中。第四部將函數聲明提高,值賦給函數體。 全局預編譯是首先建立一個GO對象(blobal object),window就是GO。AO上面沒有就看GO.緩存
當內部函數被保存到外部時,將生成閉包,閉包會致使做用域鏈不釋放,形成內存泄漏。閉包
構造函數必須用new 這個操做符,構造函數內部原理是使用new以後,裏面會有三步隱式轉換。app
原型是function對象的的一個屬性,他定義了構造函數製造出來的對象的公有祖先。經過該構造函數產生的對象,能夠繼承原型的屬性和方法。原型也是對象。 使用原型能夠提取出來公有屬性。對象屬性的增刪和原型上屬性的增刪改查。對象經過__proto__ 查看原型。對象可經過constructor查看構造函數。函數
函數的原型是另外一個構造函數,另外一個構造函數有原型,就造成原型鏈。原型鏈上的增刪改查和原型基本一致,只有本人有的權限,資損失沒有的。 誰調用的方法內部this就指向誰。絕大多數的對象最終都會繼承自Object.prototype 除了 Object.create(null?原型)this