前端週記20190211-20190215

一、靜態公有方法閉包

(function(){
    var privateVariable=10;
    function privateFunction(){
        return false;
    }
    MyObject=function(){}
    MyObject.prototype.publicMethod=function(){
        privateVariable++;
        return this;
    }
})();
var a=new MyObject();
console.log(a.publicMethod());

MyObject在私有做用域中在原型上掛載了一個公有方法,能夠訪問私有做用域中的變量。
思考:原型上的函數的做用域含有被添加時的做用域。
二、js運行機制(Event Loop)
分爲主線程和任務隊列,主線程爲空時,會讀取任務隊列中的事件(代碼)。
任務隊列是一個事件隊列,只要指定過回調函數的事件在事件發生時就會進入任務隊列。
回調函數:會被主線程掛起來的代碼,異步任務必須指定回調函數。
settimeout和setInterval是到設置的事件後才觸發回調函數,也就是添加到任務隊列中。這裏設置的時間是相對於在下一輪事件循環開始時的時間的間隔。這個時間是js執行到settimeout這個語句開始計算。h5中對時間標準化,最小4ms,不足則補齊
經過閱讀Promise/A+規範,能夠得知異步的實現可分爲兩個機制,分別是macro-task和micro-task。
Macrotasks包括: script(總體代碼)、setTimeout, setInterval, setImmediate, I/O, UI Rendering;
Microtasks包括: process.nextTick, Promise, Object.observe, MutationObserver。
Macrotasks、Microtasks執行機制:
1.主線程執行完後會先到micro-task隊列中讀取可執行任務
2.主線程執行micro-task任務
3.主線程到macro-task任務隊列中讀取可執行任務
4.主線程執行macro-task任務
5....轉到Step 1
這裏注意的是,UI Rendering是在micro-task以後執行,須要在UI渲染以前執行的邏輯,通常採用micro-task異步回調方式進行調用
五、說明this幾種不一樣的使用場景
做爲構造函數執行:指向new生成的對象
做爲對象屬性執行:指向調用的對象
做爲普通函數執行:指向調用的對象
做爲回調函數執行:指向調用時的上下文
settimeout和setInterval:指向調用時的上下文即window
閉包:指向當前函數
箭頭函數:指向定義時的上下文
call、apply、bindapp

相關文章
相關標籤/搜索