有没有必要弄个全局空函数

既然空的变量是null
那是不是也弄个全局的空函数
nullFunction = ()=>{}
这样项目中所有使用到空函数的地方都可以指向nullFunction了
请教下懂底层原理的小伙伴,这样做有没有必要

空函数吗,Function就可以了,也是全局的,就是名字太长了。。确实有它的用处,但不多:sunglasses:

实测可以,牛逼,舒服~~ :kissing_heart:

我提供另一种思路

为什么你会有空函数的需求?

我猜大概原因是为了不想写这样的代码吧
if(callback){
callback();
}

但其实可以这样
callback?.()
// 如果callback是null / undefined,将什么也不会发生,也不会报错

请放心的设计可以接受null的callback吧,不要再传空函数了

最后,好久没上论坛了,点个赞吧,不然下次又是几个月后了 :laughing:

6赞

Function 是生成函数用的,不是每个平台都支持。而且 Function 需要一个参数,直接传 Function 给 callback 是会报错的。

是的,我刚才也碰到报错的情况了。
所以还是在纠结用全局空函数,还是直接用()=>{}

空函数主要几个用处:
1、函数默认值
callback: (tag: any, event: any, …parms: any[]) => void = () => { };
2、函数兜底值
funcText = this.func ?? (() => { });
2、动态屏蔽接口
myLog = ()=>{} //屏蔽Log日志
如果一个项目里很多地方都会用到()=>{},把他弄成一个全局函数,这样不需要每次生成一个新的()=>{}
但不知道底层是否本来就是同一个函数呢

callback?.()只是把if(callback){callback();}缩写了
大部分情况callback是不为空的,但是却每次都额外多执行一次if(callback)的判断
默认值空函数就为了规避这个额外的if判断

说得好像调用空函数一定不会有额外开销一样。做个性能对比测试吧

1赞

不是省调用的开销,只是不希望每次()=>{}创建一个新的

我是除了要调东西或者啥,把代码注释了才导致函数变空,其它情况下还没用到过空函数 :joy:

我觉得走一次if性能上应该是比执行一次空函数会好些吧

老老实实if吧,骚操作多了,指不定什么时候把自己坑到了 :joy:

1赞

还没想通这个全局空函数做什么用,, :joy:

declare global {
interface Window {
        Nf:Function
    }
    var Nf:Function
}
var _global = typeof window === "undefined" ? global : window
_global.Nf=()=>{}

你要的全局空函数

1和2感觉没有什么必要吧,第3是不是最好加开关来实现屏蔽日志?

I know,Function作为构造函数体对参数有一定的要求,我以为他只是想单纯的调一下 :rofl:

可以的,现在主要是纠结,有没有必要搞这么个全局空函数
我是觉得有必要,所有啥也不干的函数,统统指向同一个全局空函数

基于你的使用和问题做下大概分析:
1、给callback参数设置默认值:这是ES6产物,低版本主流编译方式“callback === void 0 && (callback = function(){})”,可以说看出这段代码费力不讨好哦(这个不能选);
2、空函数和if的开销问题:空函数执行开销来自“调用和返回的栈操作”,if语句的执行开销主要来自“条件表达式的值”,对于这种低频调用率来说,显然这里两者开销都很微小(别捶我,大佬们都这么说的),不过从执行流程上看,会给人一种if更快的现象。

基于你的使用目的话(callback),既然给参数设置默认值是一种费力不讨好的存在,那么就没必要去给callback赋值上一个空函数,so,如果是我会写成:callback && callback();

附注:顺便抱个歉,没搞清楚你要全局函数函数干啥,Function是构造函数体,每次调用会生成一个新的函数,对参数有限制(合理的函数体)我的锅,我一般是这么用的,骚操作 :rofl: :rofl:
image

export type Func = (…args) => void;

这里怎么能拿 if 跟 空函数 比性能呢
大部分情况callback不是空的,这俩执行频次不一样