源碼學習之noop

/**
   * Perform no operation.
   * Stubbing args to make Flow happy without leaving useless transpiled code
   * with ...rest (https://flow.org/blog/2017/05/07/Strict-Function-Call-Arity/).
   */
function noop(a, b, c) { }

這是一段vue2裏的源碼。javascript

noop,是No Operation或No Operation Performed的縮寫,意爲無操做。vue

在彙編語言中,NOOP指令一般用於控制時序的目的,強制內存對齊,防止流水線災難,佔據分支指令延遲),或是做爲佔位符以供程序的改善(或替代被移除的指令)。java

NOOP在各類語言中的例子:app

  • 在C語言中,分號(;)或空塊({})都是NOOP。
  • jQuery中,「jQuery.noop()」函數會建立一個NOOP。
  • 在Perl中,省略號(…)能夠用做NOOP。可是若是Perl嘗試執行代碼,則會給出未實現的異常。
  • 在Python中,「pass」語句可用做NOOP。
  • 在Visual Basic中,分號(;)表示NOOP。

在vue源碼中的這個noop無操做空函數,主要做用就是爲一些函數提供默認值,避免傳入undefined之類的數據致使代碼出錯。less

好比vue中:函數

new Watcher(vm, updateComponent, noop, {
      before: function before() {
        if (vm._isMounted && !vm._isDestroyed) {
          callHook(vm, 'beforeUpdate');
        }
      }
    }, true /* isRenderWatcher */);

Watcher具體實現爲:oop

var Watcher = function Watcher(
    vm,
    expOrFn,
    cb,
    options,
    isRenderWatcher
) {
    ...
}

這裏傳入noop空函數的做用,就是避免在調用回調函數cb時,程序報錯致使中斷(好比傳入undefined,執行cb的時候就會報cb is not a function錯誤)。rest

這裏也能夠直接使用一個無操做的匿名函數來代替noop。在vue2的源碼中,共有20處使用了noop函數,若是每次都建立一個匿名函數,一個是下降了代碼的可讀性,另外一個是在js壓縮時,這部分匿名函數是沒法被壓縮的,下降了代碼的壓縮率。code


參考資料:orm

相關文章
相關標籤/搜索