Javascript 是多範式語言javascript
1、命令式 2、函數式 3、面向對象java
命令式數組
基本的邏輯控制、迭代語句等。閉包
函數式函數
一、scope Chain (做用域鏈)this
Variable Object(變量對象),Activetion Object(活動對象)prototype
①VO是在函數被定義是生成的,持有 this ,arguments 和全部在當前函數中聲明的變量、函數和具名函數參數;對象
②VO上私有的parent屬性指向外層函數的VO,造成VO scope Chain繼承
③最頂層函數的parent指向window,window指向本身。因此,window是scope CHhain的終點。ip
二、read variable
①沿VO Chain,逐個向上查找變量名,返回第一個找到的結果;
②若知道window尚未找到VO,則會拋出reference error;
三、write variable
①沿VO Chain,逐個向上查找變量名,對第一個找到的結果進行賦值;
②若知道window仍未找到,則在window上聲明該變量,並賦值;
③在strict mode下,第二步裏會拋reference error.
④變量、函數聲明會被提高到當前函數的開頭
⑤閉包:函數會始終持有被定義時的scope chain。因此該函數即便離開當前環境後,仍能訪問被定義時能夠訪問的全部變量
面向對象
一、Prototype Chain(原型鏈)
①對象實例化時,會將構造函數的prototype賦值給對象的私有變量中(prototype);
②prototype也是一個對象實例,若沒有人爲置換對象,則其爲Object的實例;
③Object.prototype上,沒有prototype。因此Object.prototype始終是prototype chain的終點。
二、Read instance property(讀取實例屬性)
①先在當前instance上查找該property,若沒有找到,則沿prototype chain向上查找,返回第一個找到的結果;
②若一直找到prototype chain的終點,仍沒找到,則返回undefined
三、write instance property(寫實例屬性)
①若當前實例存在該property,直接對其進行賦值;
②若當前實例上沒有該property, 則在實例上建立該property並賦值;
③對實例屬性賦值不會影響到prototype,以及相應構造函數的其餘實例;
④若prototype上有引用類型的值,例如對象、數組,若在實例上對其狀態進行修改,則會影響全部的實例
四、類和繼承
①定義類的本質:擴充原型,使其全部實例能夠訪問相應的屬性、方法;
②繼承的本質:延長原型鏈,將父類的實例置於子類原型鏈上,使子類的實例能夠訪問父類及其原型鏈上的全部屬性和方法。
這篇文章原文是在網上的,我本身整理了一下,敲出來的。感受對javascript的脈絡更清晰了。