1. 程式人生 > 其它 >前端知識之查漏補缺二

前端知識之查漏補缺二

1.promise的優缺點

  缺點:

    1.一旦開始無法取消

    2.pending過程中,無法知道具體執行到哪個階段是剛開始還是即將結束

    3.不設定回撥函式,錯誤無法丟擲到外部

  優點:

    1.解決回撥地獄,層層巢狀的問題,改為鏈式結構

    2.更好地進行錯誤捕獲,在層層巢狀的模式中使用定時器來丟擲異常,但是由於執行棧和原函式不同,無法丟擲錯誤,而promise reject即可

Q:promise 中then 塊預設會向下順序執行,return 是不能中斷的,可以通過 throw 來跳轉至 catch 實現中斷

function fetch(callback) {
    setTimeout(() 
=> { throw Error('請求失敗') }, 2000) } try { fetch(() => { console.log('請求處理') // 永遠不會執行 }) } catch (error) { console.log('觸發異常', error) // 永遠不會執行 } // 程式崩潰 // Uncaught Error: 請求失敗 function fetch(callback) { return new Promise((resolve, reject) => { setTimeout(()
=> { reject('請求失敗'); }, 2000) }) } fetch() .then( function(data){ console.log('請求處理'); console.log(data); }, function(reason, data){ console.log('觸發異常'); console.log(reason); } );

2.定時器為什麼不精確

  eventloop迴圈機制中,非同步事件定時器的時間間隔設定,只是把定時器中的執行程式碼新增到任務佇列中的時間,而不是執行時間,任務佇列中如果有其他任務,需要等其他任務執行完成後才能繼續執行,所以佇列中的其他非同步執行任務會導致

定時器的不精確

可使用動態計算時差和web Worker來解決

3.閉包的優缺點

  閉包:可以訪問區域性作用域之外的函式

  優點:

    1.匿名自執行函式,不會汙染全域性物件,執行完就回被會被釋放

    2.快取,將建立的變數的值始終保持在記憶體中,例如函式柯里化 const add = a => b => a + b

    3.實現封裝,封裝物件的私有屬性和私有方法

  缺點:

    1.記憶體消耗

     通常來說,函式的活動物件會隨著執行期上下文一起銷燬,但是,由於閉包引用另外一個函式的活動物件,因此這個活動物件無法被銷燬,這意味著,閉包比一般的函式需要更多的記憶體消耗。使用不當會很容易造成記憶體洩露。

    2.效能問題

     使用閉包時,會涉及到跨作用域訪問,每次訪問都會導致效能損失。