JS基礎回顧

本篇來源:像天天騎共享單車同樣,不知道本身爲何可以掌握平衡,也不記得是如何學會的。曾經還有一些特殊技能(以下圖),如今也不會了。只會慢悠悠的騎着。。。JS基礎也有這種用進廢退的感受,這種感受很是很差。碰巧翻出了一本老書《Javascript核心概念及實踐》,因而便結合筆記以及一些曾經記錄的碎片知識總結了這篇JS基礎。html

Javascript簡述

一丶語言特性

Javascript是一門動態的、弱類型、基於原型的腳本語言。

  • 動態性:對象在聲明時不須要定義屬性及類型。能夠隨時更改對象結構。
  • 弱類型:變量在聲明時不須要指定數據類型。類型和值是關聯的而不是和變量關聯。
  • 基於原型:每一個對象都有prototype屬性,即原型。

二丶基本概念

1.數據類型

  • Javascript中數據類型分爲兩種:
    • 基本數據類型(string,number,boolean,underfined,null)
    • 對象類型(object,array,function)
  • 數據類型間的轉換:
    • 手動:Object.stringify(OBJ)、Object.parse(str)、valueOf()、toString()等方法
    • 自動:例如:if(判斷條件)時,判斷條件若是不是布爾值會自動轉換爲布爾值。
  • 檢測數據類型:typeof、instanceof

2.變量

  • 變量的定義:變量是對值在存儲空間的引用。
  • Javascript中數據類型分爲兩種:
    • 基本類型:變量直接訪問數據值(棧)
    • 引用類型:變量是其引用地址,指向數據存儲的位置(堆)

三丶對象和原型

1.JS中的對象

  • 定義:對象是屬性的集合(以及一個原型對象)
  • 對象的屬性:K-V對
    • K:屬性的名字,是一個字符串
    • V:屬性的值,任意JS對象
  • 全局對象
           JS引擎在初始化時,會構建一個全局對象。在瀏覽器環境中,這個全局對象就是window對象。全部在頂級做用於下生命的變量均可以看做window對象的屬性。

2.原型

  • 原型對象和原型鏈
    • prototype: 每一個對象都有一個prototype屬性,叫作原型對象.它是一個對象或null,
    • __ proto : 每一個實例函數都有一個 proto __屬性,叫作原型.它其實就是構造函數的prototy.
    • constructor 每一個原型對象都有一個constructor屬性,叫作構造函數.也就是咱們進行面向對象編程過程當中定義的構造函數.
  • 原型鏈:
            在 JavaScript 中,若是想訪問某個屬性,首先會在實例對象的內部尋找,若是沒找到,就會在該對象的原型(__ proto __)上找,咱們知道,對象的原型也是對象,它也有原型,若是在對象的原型上也沒有找到目標屬性,則會在對象的原型的原型上尋找,以此內推,直到找到這個屬性或者到達了最頂層null。在原型上一層一層尋找,這便就是原型鏈了。
  • 繼承
            因爲原型鏈查找是之下而上的,返回最早遇到的屬性。經過這個機制能夠完成繼承和重載

3.面向對象:

       面向對象的思想是將待解問題抽象爲程序中的對象。而後經過對象間的協同合做完成功能,經過功能的集合完成整個項目
編程

  • JS實現面向對象:
           JavaScript也是一門面向對象的語言,但在 ES6 以前,JavaScript 中沒有 class 語法。 那麼JavaScript是如何建立實例對象的呢?這就須要引入構造函數(constructor)了。經過使用 new 關鍵字來調用構造函數生成實例對象.
    數組

  • 實例化過程:瀏覽器

    • 引擎會建立一個空對象{}。
    • 這個空對象的原型的contructor上下文指向構造函數
      obj.__proto__.contructor= Class;
      等同於
      obj.__proto__ = Class.prototype;
      複製代碼
    • 執行構造函數
    • 返回建立的這個對象

四丶函數

       在Javascript中函數自己也是對象,與其餘任何內置的對象同樣.

1.函數對象

  • 建立函數是什麼?
           在全局做用域下,建立函數的過程其實就是對全局對象添加一個屬性的過程,只不過屬性的值是一個函數類型的對象.其餘做用域也是如此.
  • 建立的方法
    • var fuc=new Function()
    • function fuc(){}
    • var fuc = function(){}

2.函數的參數

  • 函數對象在生成時,產生一個類數組對象--arguments.不管函數是否有形參,實參都會以數組的形式,保存在這裏.

3.函數做用域

  • Javascript中的做用域爲詞法做用域,即在定義(預編譯)階段就肯定下來了,並不是在執行階段肯定的.詳情
  • Javascript的函數在局部做用域內運行,若內部對變量沒有定義,能夠訪問外部變量.
  • 調用對象:在一個函數執行的時候,函數的參數和其局部變量最做爲函數調用對象(this指向)的屬性就行存儲.能夠理解爲存儲做用域信息的對象
  • 做用域鏈能夠看作調用對象組成的鏈式結構.全局做用域下的函數做用域鏈上就會有兩個對象--自身的調用對象+全局對象

JS執行過程

js中的函數做用域及預編譯的理解 事件循環主要介紹JS解釋執行過程當中同步,異步的執行過程
bash

JS預編譯執行過程 做用域、做用域鏈閉包

1.語法分析

定義: 代碼在執行前會被通篇掃描一遍,這個過程就作語法分析.app

2.預編譯

  • 預編譯階段發生變量聲明和函數聲明,但沒有初始化行爲(賦值).匿名函數不參與預編譯, 只有在解釋執行階段纔會進行變量初始化異步

  • 全局在這個階段:函數

    • 建立GO對象(global object),就是window對象
    • 查找函數聲明,函數名做爲全局對象的屬性,值爲函數引用
    • 查找全局變量聲明(包括隱式全局變量聲明,省略var聲明),變量名做全局對象的屬性,值爲undefined
  • 函數在這個階段oop

    • 建立AO(Activation object)對象,也就是做用域,也叫執行期上下文
    • 找形參和變量聲明,將變量和形參做爲AO對象的屬性名,值爲undefined
    • 將實參和形參進行對應賦值
    • 在函數體裏面找函數聲明,值賦予函數體

3.解釋執行

  • 事件循環: 在JavaScript執行時,同步任務會被放入執行棧中依次執行.異步任務掛起,在返回結果時(一般是回調函數),放入任務隊列.當執行棧的同步任務已經執行完成時,將最早進入任務隊列的任務加入到執行棧中執行。去任務隊列讀取任務到執行棧中去執行,這個過程是循環往復的,這即是 Event Loop,事件循環。

  • 執行棧:瀏覽器執行隊列

  • 任務隊列:異步回調暫存

this相關

關於 this 的解釋說明

定義:this關鍵字是一個對象.取決於當前調用該函數的對象,也就是執行時的對象。

  • 使用 call 和 apply 時,若是給 this 傳的不是對象,JavaScript 會使用相關構造函數(例如:new String())將其轉化爲對象
  • bind 方法會建立一個新函數,新函數的 this 會永久的指向 bind 傳入的第一個參數
  • 箭頭函數會從做用域鏈的上一層繼承 this。同 bind 同樣,箭頭函數也很「頑固」,咱們沒法經過 call 和 apply 來改變 this 的指向

閉包

做用域和上下文環境
閉包

很是不巧端午期間生病了,6.8日吐了整整一天,脫水有些嚴重.6.9晚上好不少了.不少東西沒來得及整理細化.又得爛尾了,難受!!!!

相關文章
相關標籤/搜索