__proto__: 每個對象都有本身的原型屬性,能夠叫作隱式原型 prototype: 每個構造函數有本身的原型屬性,能夠叫作顯式原型
那麼有一條規則是對象的隱式原型指向構造函數的顯式原型,基於這個邏輯就有了下面的原型鏈示意圖javascript
其中構造函數的顯式原型也是一個對象,那麼應該有其隱式原型指向構造函數的顯式原型,這裏的構造函數是Object,對應圖中下面一部分。
此時會有一個終點java
console.log(Object.prototype.__proto__ === null) // true
在這一部分的概念中關注如下幾點
1.constructor
實例的constructor 指向其構造函數es6
function Person() { } var person = new Person(); console.log(person.constructor === Person); // true
2.單獨說一下Function
按照前面說的 Function 既是構造函數,自己也屬於js 對象的範疇
那就應該有Function.__proto__ === Function.prototype瀏覽器
3.原型鏈
到這裏原型鏈應該就好理解了,訪問實例a的屬性,假如沒有找到就會去原型裏找,就像上面的指向流程異步
在es6以前只有函數做用域和全局做用域的概念,咱們主要聊的就是函數做用域函數
做用域是指程序源代碼中定義變量的區域,javascript 採用詞法做用域,函數的做用域在函數定義的時候就決定了,肯定當前執行代碼對變量的訪問權限。
這一塊看下例子便可學習
var scope = "global scope"; function checkscope(){ var scope = "local scope"; function f(){ return scope; } return f(); } checkscope();
var scope = "global scope"; function checkscope(){ var scope = "local scope"; function f(){ return scope; } return f; } checkscope()();
明白輸出的結果,應該就理解了做用域的定義this
在學習異步知識點的時候,咱們知道瀏覽器是異步單線程,在一次事件循環中會先處理同步事件,入棧出棧,而異步事件會加入到事件隊列等待執行。
那這裏的執行棧是什麼呢?這裏涉及到如下概念須要瞭解spa
當 JavaScript 代碼執行一段可執行代碼時,會建立對應的執行上下文prototype
一個個來認識
變量對象: 在當前上下文中定義的變量和函數聲明
在具體分析的過程當中分爲兩步,進入執行上下文和代碼執行,對於一個函數明確AO和VO分別是什麼。
多個執行上下文的變量對象構成的鏈表就叫作做用域鏈,這是在訪問變量的時候肯定的,那具體的做用域鏈由什麼組成