当前位置: 首页 > 科技观察

不使用JS匿名函数的三个原因

时间:2023-03-17 13:39:58 科技观察

看代码的时候,一定要注意匿名函数。有时它们被称为lambda,有时它们是匿名函数,无论哪种方式我都认为它们不好用。如果您不知道什么是匿名函数,请引用以下内容:匿名函数是在运行时动态声明的函数。它们之所以称为匿名函数,是因为与普通函数不同,它们没有函数名。—HelenEmerson,Helephant.com匿名函数具有以下形式:function(){...code...}OR(args)=>{...code..}今天我试图让它只在绝对时才易于理解接下来是使用匿名函数的思路。匿名函数不应该被黑客攻击,你应该知道你自己为什么要使用它们。当你理解这个想法时,你的代码会变得更干净、更容易维护,也更容易追踪错误。让我们从避免匿名函数的三个原因开始:无论你的编码能力有多好,错误都在所难免。有时这些错误很容易被发现,有时则不然。如果您知道错误的来源,就很容易发现错误。为了轻松找到错误,我们使用称为堆栈跟踪的工具。如果您不知道堆栈跟踪,goole提供了很好的介绍。假设现在有一个很简单的项目:functionstart(){(functionmiddle(){(functionend(){console.lg('test');})()})()}上面有一个很愚蠢的错误代码,错字(console.log)。在小项目中,这个错字没什么大不了的。如果这是一个包含许多模块的非常大的项目的一小部分,那将是一个大问题。假设这个愚蠢的错误不是你的,新的初级工程师会在休假前将这个错误提交到代码库!现在,我们必须追踪它。使用我们精心命名的函数,我们得到这样的堆栈跟踪:感谢您命名您的函数,初级开发人员!现在我们可以很容易地追踪到这个错误。但是..一旦我们修复了它,结果发现还有另一个错误。这次是由一位更资深的开发人员介绍的。此人了解lambda(匿名函数)并在他的代码中大量使用它们。原来他们偶然发现了一个错误,我们的工作就是追踪它。这是代码:(function(){(function(){(function(){console.lg('test');})();})();})();作者也忘记console.log怎么拼了!真是巧合!遗憾的是,他们都没有命名他们的功能。那么控制台输出什么呢?好吧,我们至少还有行号,对吧?在这个例子中,看起来我们有大约7行代码。如果我们正在处理一大块代码怎么办?像10,000行代码?行号跨度这么大怎么办?如果代码折叠后没有代码映射文件,行号的渲染是基础吗?只是没用吗?我认为这些问题的答案相当简单,答案是:想想它会让你的一天很痛苦。可读性嘿,我听说你不相信。你仍然依附于你的匿名函数,而且从来没有出现过错误。我的错,你的代码是完整的。但是让我们看看这个!看一下下面两段代码:reject(e);}});}initiate(true).then(res=>{if(res){doSomethingElse();}else{doSomething();}).catch(e=>{logError(e.消息);restartApp();});这是一个非常不寻常的例子,但我相信你明白我想说的。我们违背了一个promise方法,我们使用这个promise对象/方法来处理不同的响应。您可能认为几段代码很容易阅读,但我认为它们可以做得更好!如果我们删除所有匿名函数怎么办?functioninitiate(arguments){returnnewPromise(checkForArguments);}functioncheckForArguments(resolve,reject){try{if(arguments){returnresolve(true);}returnresolve(false);}catch(e){reject(e);}}functionevaluateRes(res){if(res){doSomethingElse();}else{doSomething();}}functionhandleError(e){logError(e.message);restartApp();}initiate(true).then(evaluateRes).catch(处理错误);好吧,让我们明确一点:这部分代码更长,但我不认为它只是增加了可读性!我们精心命名的函数与匿名函数不一样,只要我们一看到它们的名字就知道它们做了什么。这避免了评估代码时的心理障碍。这也有助于理清关系。在第二个示例中,没有创建一个方法,传递它,然后运行逻辑,而是将参数提供给then和catch只是指向发生所有事情的函数。关于提高可读性,我没有什么可以说服您的了。但也许如果你还不相信,我可以试试***的论点。可重用性你注意到最后一个例子了吗?在最后一个例子中,函数的使用范围从参数和初始化函数,到使其可用于所有函数。当您使用匿名函数时,这些函数很难在您的应用程序中重用。没有可重用性,您最终将一遍又一遍地编写重复代码。正如我们所见,编写更少的代码会引入更少的错误,并且用户必须加载的内容也更少。每个人都从中受益!相反,命名函数可以全局使用,而不是像变量一样传递。你的代码的可重用性会更好。有匿名函数的地方吗?是的。尽管我不愿意承认,但有时使用匿名函数是最好的选择。conststuff=[{hide:true,name:'justin'},{hide:false,name:'lauren'},{hide:false,name:'max'},];constfilteredStuff=stuff.filter(s=>!s.隐藏);上面代码中的匿名函数s=>!s.hide非常简单,即使不能在别处使用,也不会对其他人造成任何影响,而且还可以在stuff.filter中显示堆栈调用。如果你想重用这段代码,***重用整个代码:范围保证不被污染。(()=>{...你的代码...})();在栈空间有一个***匿名函数真的没什么错。没有代码重用是痛苦的,因为完整性的目的是保持方法的包含。我相信这还有其他好的用途,请随时在评论中分享!感谢阅读,现在跳出那些,停止编写匿名函数!