源码学习之noop

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

文章仅代表个人观点,如有错误,欢迎指正~

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容