匿名函数在JavaScript中是否是一种不好的实践?
JavaScript中的匿名函数是否是一种不好的实践?
不,匿名函数在整个网络中的JavaScript中被广泛使用。这可能会使调试变得有些困难,但绝不足以说不应该使用它们。
例如,JQuery广泛使用匿名函数。
有很多时候你想使用匿名函数而不是正式声明的函数,比如当你想限制它们的作用域时。
实际上,这是我停止使用jQuery的一个原因。我总是花费比我认为合理的时间来确定一个bug是我的代码中的语法错误、逻辑错误,还是jQuery本身的问题。不得不承认,一个匿名函数的调用堆栈不像一个具名函数那样一目了然。
你总是可以使用一个命名的函数表达式。
所以,匿名函数在JavaScript中并不是一种不好的实践。它们被广泛使用,并且有很多情况下它们比正式声明的函数更加适用。虽然在调试过程中可能会有些困难,但可以通过使用命名的函数表达式来解决这个问题。
匿名函数在JavaScript中是否是一种不好的实践?
匿名函数是一种广泛使用的编码风格,但我要与主流意见有所不同,认为匿名函数实际上是一种不好的实践。
首先,匿名函数不能被重复使用,这是一个问题。其次,由于匿名函数没有名称,因此无法描述其功能,代码本身并不具备自描述性。这也给代码的阅读和调试带来了困难。
另外,匿名函数无法在单元测试框架中进行独立测试,这也是一个缺点。个人而言,我认为匿名函数使代码更难以阅读和调试,尽管每个人的经验可能有所不同。
然而,并不是说匿名函数完全没有用处。在某些情况下,匿名函数可能是最佳选择。为了避免上述问题,我几乎总是给我的函数命名。
一般来说,匿名函数越长,它受益于命名的可能性就越大。
某些情况下匿名函数和闭包可以被重复使用,因为每个函数都是一个值,可以赋值给变量或作为函数参数传递。这取决于如何在适当的层次/作用域中暴露函数对象。
对于匿名函数是否可以给定一个显式名称,有人表示取决于上下文。同时,是否可以对匿名函数进行测试取决于被测试的内容、测试方法以及函数对象的暴露方式。
关于匿名函数是否使代码更难以阅读和调试,有人表示闭包/lambda函数在某些情况下可能被滥用,但是无论是最简单的过程代码语句还是匿名函数,糟糕的编码者始终是糟糕的编码者。
有人对匿名函数的定义提出了疑问,认为给函数赋予名称并将其分配给变量时,它不再是匿名函数。要求给出一个具有名称的匿名函数的示例。
问题的关键是“匿名”函数这个术语是个谎言。真正的术语应该是“函数表达式”、“闭包”甚至是“lambda”(这与顶级“函数声明”或“方法”不同)。因为如何在没有给函数赋予名称的情况下使用“匿名”函数(除了立即调用的函数表达式)?
我认为“匿名函数”这个术语在社区中是被广泛理解的。它意味着一个没有被分配给变量的函数。
但是这种广义的理解是混淆的,也是不正确的。考虑这个例子:[].forEach(function() {..}) - 这个函数绑定了一个名称。或者,同样地,如果这样写是否仍然是“匿名” - var filter = function() { .. }?问题在于“匿名”是一个不准确的术语。
对此,我不同意。在你的例子中,传递给forEach函数的函数确实没有名称。
它确实有一个名称-来自上下文的参数绑定的名称。在绑定的位置上,它的“匿名性”与[].forEach(doIt)是一样的。
我同意,它在稍后使用时被分配了一个名称,但在创建它的上下文中它没有名称。正是在创建它的上下文中,我列出的那四点才成立。