【问题标题】:JavaScript aesthetic: "function foo() {}" vs "var foo = function() {};" in AMD functions [closed]JavaScript 美学:“function foo() {}”与“var foo = function() {};”在 AMD 函数中[关闭]
【发布时间】:2015-05-06 06:46:48
【问题描述】:

我努力拥有单一职责的简洁功能,但我经常有这样的功能:

logic part1 (~5 lines of code)
logic part2 (~5 lines of code)
return (the results of part1 and part2)

在 JavaScript 中,我发现这种编程风格非常自我声明且易于阅读(可能在 AMD 风格的环境中):

performCalculation: function() {
    function part1() {
        // 5 lines of code
        return ...
    }

    function part2() {
        // 5 lines of code
        return ...
    }

    return part1() + part2();
}

这是好的形式吗? 或者,使用“function foo() {}”很笨重?

【问题讨论】:

  • 这看起来不错!但是你可以尝试承诺扁平化你的结构并分离责任,你这会带来更多的开销!
  • 这对于 stackoverflow 格式来说并不是一个合适的问题。如果您可以将其改写为关于编程主体而不仅仅是对意见的调查,那么它可能适合programmers.stackexchange.com
  • 我个人认为只需要 5 行代码就不需要本地函数(如果逻辑不同,最好使用它自己的方法),但如果你喜欢这个声明样式没什么问题
  • 如果您要在循环中调用它,您可能会觉得这么多函数调用的开销太高了。同样,如果您正在递归,您可能会发现您过早地达到了堆栈限制。

标签: javascript amd


【解决方案1】:

本质上,您正在创建您不希望其他人使用的私有函数。 从面向对象的角度来看,这是有效的。有关私有函数及其用法的更多详细信息,请参阅thisstackoverflow 答案。

关于“var 函数名”与“函数函数名”this 答案有很好的论据。

【讨论】:

  • 相当弱的答案。我会把这样的东西作为 cmets 发布。这个问题真的应该关闭而不是回答。但是,如果您要回答,那就让它成为一个教学机会并深入了解。
【解决方案2】:

你似乎在问两个问题:

  1. 将逻辑分解成更小的函数并组合起来是个好主意吗?

  2. var f=function(还是function f(更好?

关于第一点,是的,是的,是的。这使您的代码更易于阅读,提供了一种自文档形式,并且将更易于维护和扩展。

@c-smile 指出函数调用的成本。好吧,如果我们要担心函数调用的成本,我们都会编写 500 行函数。这应该是您最不担心的事情。需要担心的主要“成本”不是 CPU 时间,而是编写、调试和维护代码的人力时间。仅当函数在紧密循环内被调用 1M 次时,我才会担心函数调用开销(但在许多情况下,JIT 可能无论如何都会为我内联它)。他引用的 jsperf 不是苹果对苹果。 reduce 进行各种检查,处理稀疏数组等。当然它仍然会更慢,但那又如何。

关于第二点,这里已经很好回答了,见var functionName = function() {} vs function functionName() {}

【讨论】:

    【解决方案3】:

    使用函数声明格式的一大优势是您可以利用函数提升的唯一用途。

    performCalculation: function() {
        // What's key here is that the calculation is part1 + part2
        // not the details of implementation so put that first
        return part1() + part2();
    
        function part1() {
            // 5 lines of code
            return ...
        }
    
        function part2() {
            // 5 lines of code
            return ...
        }    
    }
    

    更好

    //someone reading your module likely wants to know what it's returning
    //and what its major parts are, so show that at the top of the file
    return {
        performCalculation: performCalculation
    }
    
    //...
    
    function performCalculation() {
        return part1() + part2();
    
        //these can now go outside of performCalcuation if that makes it look nicer.
        function part1() {
            // 5 lines of code
            return ...
        }
    
        function part2() {
            // 5 lines of code
            return ...
        }    
    }
    

    【讨论】:

    • 在声明变量/函数之前引用它们的 IMO 代码更难阅读...
    • @Jonathan.Brink 当你阅读一篇论文时,你会首先看到他们实验方法的细节吗?不,您会看到引言明确指出“这些是作者认为重要的要点”。这就是人类大脑的工作方式,它将朝向顶部的位置与更高层次和更重要的概念联系起来。除了不熟悉之外,我从未听说过任何在代码中避免这种情况的理由。
    • 说得好,但我想我已经习惯于在 JavaScript 中总是在调用/使用之前声明(提升 b/c)。
    • ...并且代码中“完全不熟悉”的代码模式在可读性/可维护性方面应该是一种代码味道。
    • 是的,我不否认您发现它更难阅读的现实。我建议这可能是值得的,只需付出最小的努力就能感到舒适。至于可维护性,最重要的是与您编写代码的意图之后的人进行沟通。这只是启用这种通信的另一个工具。
    【解决方案4】:

    如果与本地代码块相比,JS 中的函数调用是相当昂贵的。以http://jsperf.com/anonymous-vs-named-function-passing/3 为例

    我不明白这是怎么回事

    performCalculation: function() {
        var part1; {
            // 5 lines of code
            part1 = ...;
        }
    
        var part2; {
            // 5 lines of code
            part2 = ...
        }
    
        return part1 + part2;
    }
    

    比你拥有的更糟糕。

    【讨论】:

    • 我赞成你的答案,但我发现你建议的语法很尴尬......
    • @Jonathan.Brink 如果它让你感觉更好,这段代码有错误,我无法确定作者的意图。
    • 如果我们要担心函数调用的成本,我们都会编写 500 行函数。这应该是您最不担心的事情。需要担心的主要“成本”不是 CPU 时间,而是编写、调试和维护代码的人力时间。仅当函数在紧密循环中被调用 10M 次时,我才会担心函数调用开销(但在许多情况下,JIT 可能无论如何都会为我内联)。 WRT你的jsperf,这不是苹果对苹果。 reduce 做各种检查,处理稀疏数组等等。当然还是会慢一些,但那又怎样。
    • @torazaburo 你、我和乔纳森的情况可能不同。如果多次调用 performCalculation ,则最好避免使用内部函数。只是为了最大限度地减少 CPU 消耗并最大限度地延长电池寿命,从而使我们的审美感受与环境足迹相协调,干杯:)
    • @c-smile 不,我不需要最小化 CPU 消耗。这是完全错误的。我需要编写我和其他人可以轻松理解和维护的漂亮、干净的代码,如果我决定使用函数来构建它,开销绝对是最小的。
    猜你喜欢
    • 2019-02-08
    • 2011-05-17
    • 2013-03-03
    • 2015-03-08
    • 2014-11-09
    • 2011-03-24
    • 1970-01-01
    相关资源
    最近更新 更多