做用域鏈的概念:web
要理解ES中做用域鏈,首先要從理解執行環境開始。ES中代碼執行都是在一個具體的執行環境中進行的,每一個執行環境有一個與之關聯的變量對象,該變量中包含着在這個執行環境中能夠訪問的變量和函數。這裏所說的執行環境就至關於做用域。最外圍的執行環境是全局環境,在web瀏覽器中也就是window對象。某個執行環境中的代碼執行完畢以後,該環境會被銷燬,包含在其中的全部變量和函數也會被銷燬,而全局環境會在關閉網頁或瀏覽器時纔會被銷燬。瀏覽器
每一個函數都有一個本身的執行環境,在執行時彈入環境棧,執行完畢以後彈出。所以當代碼在某個環境中執行時會建立一個變量對象的做用域鏈。這個做用域鏈從當前環境的變量對象開始,指向其包含環境的變量對象,依次向前,直到全局對象window結束。在代碼執行進行數據訪問時,會沿着這條做用域鏈依次尋找標識符。所以全局環境只能訪問全局變量和函數,而不能夠訪問函數中定義的數據,函數中的數據只能夠在該函數的執行環境或者其從屬環境中訪問獲得。函數
原型鏈的概念:prototype
原型是與構造函數相關的一個概念。在定義構造函數時,會產生一個prototype屬性指向一個原型對象,原型對象中的屬性即爲該構造函數中定義的全部公共屬性。實例對象則會包含一個指向其構造函數原型對象的指針,由此來共享公共屬性。指針
而js中全部對象都指向一個原始對象Object,這裏使用到了繼承的概念,也就是全部自定義對象都是繼承自Object對象,能夠直接使用Object對象的屬性和方法。而繼承就是經過原型鏈來實現的。對象
假如讓構造函數A的實例對象指向另外一個構造函數B的原型對象,則經過A的實例對象就能夠訪問到B中定義的公共屬性和方法,也就是A繼承了B。以此類推,能夠經過做用域鏈的依次訪問實現多層繼承,而他們最終都會指向Object。繼承