JavaScript审美:“function foo(){}”vs“var foo = function(){};”在AMD的功能

时间:2015-03-05 02:00:57

标签: javascript amd

我努力拥有单一责任的consise功能,但我经常会有这样的功能:

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(){} "笨重?

4 个答案:

答案 0 :(得分:2)

如果要与本地代码块进行比较,则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;
}

比你的更糟糕。

答案 1 :(得分:1)

你似乎在问两个问题:

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

  2. 使用var f=function(function f(更好吗?

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

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

    关于第二点,这里已经得到了很好的解答,请参阅var functionName = function() {} vs function functionName() {}

答案 2 :(得分:0)

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

关于&var;函数名称' vs'功能函数名称' this回答有很好的论据。

答案 3 :(得分:-1)

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

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 ...
    }    
}