js基礎系列

知識點

從原型到原型鏈

  • 原型
__proto__: 每個對象都有本身的原型屬性,能夠叫作隱式原型
prototype: 每個構造函數有本身的原型屬性,能夠叫作顯式原型

那麼有一條規則是對象的隱式原型指向構造函數的顯式原型,基於這個邏輯就有了下面的原型鏈示意圖
image.pngjavascript

其中構造函數的顯式原型也是一個對象,那麼應該有其隱式原型指向構造函數的顯式原型,這裏的構造函數是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

  1. 執行上下文

當 JavaScript 代碼執行一段可執行代碼時,會建立對應的執行上下文prototype

  • 變量對象(Variable object,VO)
  • 做用域鏈(Scope chain)
  • this

一個個來認識

變量對象: 在當前上下文中定義的變量和函數聲明
在具體分析的過程當中分爲兩步,進入執行上下文和代碼執行,對於一個函數明確AO和VO分別是什麼。

  1. 做用域鏈

多個執行上下文的變量對象構成的鏈表就叫作做用域鏈,這是在訪問變量的時候肯定的,那具體的做用域鏈由什麼組成

相關文章
相關標籤/搜索