关于前端:源码学习之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里的源码。

noop,是No Operation或No Operation Performed的缩写,意为无操作。

在汇编语言中,NOOP指令通常用于管制时序的目标,强制内存对齐,避免流水线劫难,占据分支指令提早),或是作为占位符以供程序的改善(或代替被移除的指令)。

NOOP在各种语言中的例子:

  • 在C语言中,分号(;)或空块({})都是NOOP。
  • jQuery中,“jQuery.noop()”函数会创立一个NOOP。
  • 在Perl中,省略号(…)能够用作NOOP。然而如果Perl尝试执行代码,则会给出未实现的异样。
  • 在Python中,“pass”语句可用作NOOP。
  • 在Visual Basic中,分号(;)示意NOOP。

在vue源码中的这个noop无操作空函数,次要作用就是为一些函数提供默认值,防止传入undefined之类的数据导致代码出错。

比方vue中:

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

Watcher具体实现为:

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

这里传入noop空函数的作用,就是防止在调用回调函数cb时,程序报错导致中断(比方传入undefined,执行cb的时候就会报cb is not a function谬误)。

这里也能够间接应用一个无操作的匿名函数来代替noop。在vue2的源码中,共有20处应用了noop函数,如果每次都创立一个匿名函数,一个是升高了代码的可读性,另一个是在js压缩时,这部分匿名函数是无奈被压缩的,升高了代码的压缩率。


参考资料:

  • NOP
  • No-operation instruction
  • noop in Javascript
  • What is the JavaScript convention for no operation?

评论

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

这个站点使用 Akismet 来减少垃圾评论。了解你的评论数据如何被处理