同步 異步和事件

同步和異步 事件

瀏覽器提供了同步和異步機制 JS是單線程的,提供了兩個隊列,一個是主隊列(放同步代碼),一個是異步隊列隊列池ajax

同步

全部的代碼按順序執行,每一部分執行完後才能執行下面的代碼。promise

異步

這塊代碼執行後,能夠去作其餘事情,等這塊代碼執行完後,再回來處理這裏的事項。瀏覽器

  • 異步性能會比較高 
    • 回調函數 ajax 定時器 時間

區別

  • 先執行同步的代碼,再執行異步的代碼。
  • 同步代碼執行結束後纔會去執行異步代碼

默認定時器間隔時間 5~10ms異步

問題

異步回調地獄 
所有寫成同步又會形成代碼阻塞
async

  • 解決:promise處理 異步代碼當成同步來寫(能夠用async + await解決)
function Promise(callback){
this.x = 1;
callback();
}

Promise

Promise是JS內置的構造函數函數

  • 參數是一個回調函數 
    • 回調函數有兩個參數: 
      • resolve(表示執行成功的回調)
      • reject(表示執行失敗的回調) 
        then方法 Promise類原型上的方法
  • then有兩個參數 
    • 第一個是成功回調
    • 第二個參數表示失敗的回調
  • then方法的返回值 
    • Promise類的實例,因此能夠繼續調用then方法
    • //除過報錯全成功 只有手動拋出異常狀態纔會變成失敗的狀態(前提是沒有再返回Promise對象) 
      Promise有三種狀態
  • 第一種是pending(等待狀態)
  • 第二種是fulfilled(成功的狀態)
  • 第三種是rejected(失敗的狀態)

事件

事件綁定:事件(行爲)發生時作些具體的事情(給事件綁定行爲) 
綁定事件分爲DOM0級事件綁定 和 DOM2級事件綁定
性能

DOM0級事件綁定問題:對同一元素,同一事件綁定多個行爲時,後面的行爲會覆蓋前面的行爲,最後只會執行最後一次綁定的行爲ui

  • DOM0級事件綁定 
    oDiv.onclick = function(){alert(1)} 
    • 事件行爲移除 
      oDiv.onclick = null
  • DOM2級事件綁定 
    oDiv.addEventListener('click',function(){alert(1)},false); 
    • 參數1:事件類型
    • 參數2:事件綁定的行爲
    • 參數3:事件傳播的方式 
      oDiv.removeEventListener('click',fn,false);
  • IE低版本瀏覽器6~8:oDiv.attachEvent('onclick',fn);,沒有作重複綁定的處理
  • oDiv.detachEvent('onclick',fn);

DOM2級綁定 addEventListenerattachEvent 
IE沒有作重複綁定處理。DOM2級事件會對同一個元素綁定同一個事件綁定屢次時只綁定一次。 
標準瀏覽器下事件綁定行爲中的this是綁定的元素 IE事件綁定行爲中是window 
IE下事件綁定行爲執行的順序是亂的,而標準瀏覽器是按照前後綁定的順序執行
this

事件對象

瀏覽器記錄了事件相關的信息spa

  • //自己存在,用來存儲事件相關的信息 也能夠用arguments[0]接收
  • 標準瀏覽器放在參數裏接收
  • ie6~8:經過window.event接收
  • e = e || window.event
let oDiv = document.getElementsByClassName('box')[0];
oDiv.onclick = function (e) {//自己存在,用來存儲事件相關的信息 也能夠用arguments[0]接收
console.log(e.clientX);//到可視窗口左邊的距離
}
  • e.clientX:到可視窗口左邊的距離
  • e.clientY:到可視窗口上邊的距離
  • e.pageY :到文檔左邊的距離(包含滾動條卷出去的高度) e.clientY + document.documentElement,scrollTop||docment.body.scrollTop
  • e.target: 事件源 事件綁定的元素
  • e.preventDefault 阻止默認行爲 
    • ie低版本瀏覽器:e.returnValue = false
  • e.stopPropagation 阻止冒泡 
    • ie低版本瀏覽器:e.cancleBubble = true

事件傳播

  • 冒泡和捕獲 不能同時看到
  • DOM0級事件只能看到事件冒泡
  • DOM2級事件能夠本身設置冒泡(false)或捕獲(true)
事件冒泡

當前元素事件被觸發後,其祖先元素的相同事件也會被觸發 由內往外(先本身後祖先)

事件捕獲

當前元素事件被觸發後,其祖先元素的相同事件也會被觸發 由外往內(先本身後祖先)

事件委託

oUl.get(0)

訂閱發佈模式

  • 讓寫出的代碼具備可維護性,可複用性,可移植性。再也不專一於代碼自己,而是站在宏觀的角度思考代碼,想如何規劃和管理代碼
  • 代碼至少知足」低耦合 高內聚」
  • 低耦合:每一個模塊之間的代碼沒有關聯性
  • 高內聚:每一個模塊代碼都是由關聯性很強的代碼組成,都是用來實現單一的功能,得遵照單一職責的原理
  • 如何將單獨的功能在須要執行的地方執行 ->訂閱發佈模式 
    訂閱和發佈

訂閱

作計劃

發佈

執行計劃

取訂閱

取消計劃

相關文章
相關標籤/搜索