JavaScript:不使用 JS 匿名函数的三个理由

Stella981
• 阅读 782

JavaScript:不使用 JS 匿名函数的三个理由

今天我们来聊聊匿名函数的使用,因为无论你在什么时候写代码,您都必须注意到匿名函数。

有时它们被称为 lambda,有时是叫做匿名函数,不管怎样,我认为他们是不好使用的。

如果你不知道匿名函数是什么,这里有一个引语:

匿名函数是一种在运行时动态声明的函数。它们之所以被称为匿名函数是因为不同于普通函数,它们并没有函数名。

匿名函数形式如下:

JavaScript:不使用 JS 匿名函数的三个理由

今天我来让大家理解,只有在绝对需要的情况下才应该使用匿名函数。

因为匿名函数不应该是首选,而且你自己也应该知道为什么使用它。

当理解为什么要这样做之后,你的代码就可以变得更简洁,更容易维护,并且更容易找到bug。

先从下面避免使用匿名函数的三个理由开始吧:

一、错误追踪(找BUG)

对于开发人员,无论你多么擅长写代码,出现错误也是不可避免的。有时候,这些错误很容易被查出,有时候并不容易找到。

如果你知道这些错误来自哪里,那么错误会很容易被查出来。为了容易查出错误,我们可以使用一个叫做堆栈轨迹的工具。

如果你不了解堆栈轨迹,可以百度一下,百度有讲解。

假设现在有一个非常简单的项目:

JavaScript:不使用 JS 匿名函数的三个理由

上面代码里面有一个非常愚蠢的错误,拼写错误(console.log)。

在小项目里面,这个拼写错误不是什么大问题。如果这是一个有非常多模块非常大的项目一小段,问题就大了。

假设这个愚蠢的错误不是你犯的,那么新来的初级工程师将会在他休假之前把这个错误提交到代码库!

现在,我们必须追查。 使用我们精心命名的函数,现在我们可以轻松地追踪到这个bug。

但是....一旦我们解决了这个问题,就会发现还有另一个bug。

这次是一位更资深的开发人员的代码。

这个人知道lambdas(匿名函数),并在代码中大量使用它们。 结果他们偶然发现了一个bug,我们的工作就是追踪这个bug。

下面是他的代码:

JavaScript:不使用 JS 匿名函数的三个理由

吃不吃惊,惊喜不惊喜,这名开发者也忘记了如何拼写console.log了!这也太巧了!令人感到遗憾的是,他们都没有命名他们的函数。

那么控制台会输出什么呢?

好吧,我们至少还有行号,对吧?在这个例子中,看起来我们有大约7行代码。

如果我们处理一大段代码会如何呢?

比如一万行代码?

行号的跨度如此之大该怎么办呢?

如果代码被折叠后有没有一个代码地图文件,那么对行号的渲染是不是根本就是没有什么用了呢?

我想对这些问题的回答相当简单,答案就是:想这些会让你一整天的心情非常难受。

二、可读性

有些朋友看到这里还不信,仍旧对你的匿名函数恋恋不舍,并且还从未发生过bug。我的错,你的代码是完整的。但是让我们看看下面两段代码:

JavaScript:不使用 JS 匿名函数的三个理由

JavaScript:不使用 JS 匿名函数的三个理由

这是一个非常不正常的例子,但是我相信你已经明白我要说什么了。

我们反回了一个promise方法,我们用这个promise对象/方法处理不同的响应。

你也许会认为几段代码读起来并不难,但我认为它们可以变得更好!

比如说去掉所有的匿名函数会怎样呢?

JavaScript:不使用 JS 匿名函数的三个理由

JavaScript:不使用 JS 匿名函数的三个理由

OK,在这里先讲一下:可以看到这部分的代码更长,但我不认为只是增加了可读性!

我们精心命名的函数与匿名函数不一样,只要我们一看到它们的名字就知道它们的功能是什么。

这避免了在评估代码时出现一些误会。

这也有助于分清楚其中的关系。

与创建一个方法、将其传递、然后运行逻辑不同,在第二个例子中的参数被给到了then,catch只是指向了发生所有事情的函数。

三、可重用性

你注意到上一个例子了吗?上个例子中的函数的使用范围从参数和初始化函数,变为让所有函数都能使用。

当你使用匿名函数时这些函数很难在你的应用程序内重复使用。

可重用性将不复存在,最终你会一遍又一遍地写重复的代码。

正如我们所见的,代码写的越少引入的Bug就越少,用户必须加载的内容就越少。所有人都会因此获益!

相反的,命名函数可以全局使用,而不需要像变量一样到处传递。你的代码的可重用性会更好。

那匿名函数还有可取的地方吗?

说了那么多,你可能会开始怀疑匿名函数是不是一无是处了,那为什么还要存在我们的开发当中???

其实匿名函数是又很多好处的,虽然很不愿意承认,但有的时候使用匿名函数是最好的选择。

看一个代码:

JavaScript:不使用 JS 匿名函数的三个理由

上边代码中的匿名函数s => !s.hide非常简单,即使不能在别的地方使用也不会对别人有任何影响,而且也可以在stuff.filter中显示出堆栈调用。

如果想要重用这段代码,最好重用整段代码:

JavaScript:不使用 JS 匿名函数的三个理由

有时你想把你所有的代码封装到匿名函数中,以保证全局范围不会被污染。

JavaScript:不使用 JS 匿名函数的三个理由

在栈空间中拥有一个顶级的匿名函数真得不会有什么错误。没有代码重用是痛苦的,因为完整的目的是保持方法内含。

好了,今天就讲那么多,我敢肯定,还有很多比我更好的方法,欢迎大家在留意评论分享啦!

喜欢的朋友,转发一下,发现给你的朋友们吧!


前端开发工程师班今天最后2天免费赠送价值千元的课程大礼包!快来咨询学习吧!

JavaScript:不使用 JS 匿名函数的三个理由

JavaScript:不使用 JS 匿名函数的三个理由

本文分享自微信公众号 - 前端研究所(WEBqdyjs)。
如有侵权,请联系 support@oschina.cn 删除。
本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一起分享。

点赞
收藏
评论区
推荐文章
blmius blmius
3年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
皕杰报表之UUID
​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为
待兔 待兔
5个月前
手写Java HashMap源码
HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22
Jacquelyn38 Jacquelyn38
3年前
2020年前端实用代码段,为你的工作保驾护航
有空的时候,自己总结了几个代码段,在开发中也经常使用,谢谢。1、使用解构获取json数据let jsonData  id: 1,status: "OK",data: 'a', 'b';let  id, status, data: number   jsonData;console.log(id, status, number )
Stella981 Stella981
3年前
Android So动态加载 优雅实现与原理分析
背景:漫品Android客户端集成适配转换功能(基于目标识别(So库35M)和人脸识别库(5M)),导致apk体积50M左右,为优化客户端体验,决定实现So文件动态加载.!(https://oscimg.oschina.net/oscnet/00d1ff90e4b34869664fef59e3ec3fdd20b.png)点击上方“蓝字”关注我
Stella981 Stella981
3年前
JS 对象数组Array 根据对象object key的值排序sort,很风骚哦
有个js对象数组varary\{id:1,name:"b"},{id:2,name:"b"}\需求是根据name或者id的值来排序,这里有个风骚的函数函数定义:function keysrt(key,desc) {  return function(a,b){    return desc ? ~~(ak
Stella981 Stella981
3年前
HIVE 时间操作函数
日期函数UNIX时间戳转日期函数: from\_unixtime语法:   from\_unixtime(bigint unixtime\, string format\)返回值: string说明: 转化UNIX时间戳(从19700101 00:00:00 UTC到指定时间的秒数)到当前时区的时间格式举例:hive   selec
Wesley13 Wesley13
3年前
00:Java简单了解
浅谈Java之概述Java是SUN(StanfordUniversityNetwork),斯坦福大学网络公司)1995年推出的一门高级编程语言。Java是一种面向Internet的编程语言。随着Java技术在web方面的不断成熟,已经成为Web应用程序的首选开发语言。Java是简单易学,完全面向对象,安全可靠,与平台无关的编程语言。
Wesley13 Wesley13
3年前
MySQL部分从库上面因为大量的临时表tmp_table造成慢查询
背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_
Python进阶者 Python进阶者
11个月前
Excel中这日期老是出来00:00:00,怎么用Pandas把这个去除
大家好,我是皮皮。一、前言前几天在Python白银交流群【上海新年人】问了一个Pandas数据筛选的问题。问题如下:这日期老是出来00:00:00,怎么把这个去除。二、实现过程后来【论草莓如何成为冻干莓】给了一个思路和代码如下:pd.toexcel之前把这