源码学习之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

相关文章
相关标签/搜索