node.js:嵌套函数风格代码比 ES6 类风格有害?

pdh*_*710 3 javascript node.js

(请原谅我的英语)

下面是一个非常简化的示例代码。

function test(limit) {
    let count = 0, undone = true;

    function inc() {
        // do something
        count++;
        if(count == limit)
            undone = false;
    }

    while(undone) {
        // do something
        inc();
    }
}
Run Code Online (Sandbox Code Playgroud)

我经常使用嵌套函数样式的函数,如inc()上面的示例所示。因为共享变量非常方便。
然而,有人告诉我,我的编码风格非常有害。因为每次test()(在上面的示例中)被调用时,都会inc()在内存中重复分配。他建议我改用 ES6 类样式代码。

我不能同意他的观点,但也不确定。嵌套函数风格的代码真的比 ES6 类风格有害吗?

编辑

我对这个问题进行了一个简单的基准测试,如下所示。

/sf/answers/3607146931/

结果让我有些惊讶。我错了。我的顾问是对的。

编辑 首先,这篇文章的标题是“闭包样式代码是......”。我将其修改为“嵌套函数样式代码是...”。

sle*_*man 5

对于上面的例子,使用闭包来维护私有变量和使用类来维护同一件事在理论上没有显着差异。

使用闭包将在每次test调用函数时分配一个新的函数对象。

使用类将在每次test调用函数时分配一个新对象。

理论上,两者都分配内存并且都花时间调用构造函数。

有些人可能会反对这样一个事实:每次都需要重新编译函数,而类中的方法只编译一次。请注意,闭包也可以优化为仅编译一次。所以这只是一个微观优化问题。

从学术上来说,闭课和课程是等效的。我认为我们第一次理解这一点是在 Lisp 使用闭包将对象和类实现为一个库而没有对语言进行任何修改时,但从那时起,已经发表的研究论文证明闭包和类在计算上是等效的 - 只是它们的功能集略有不同。

当谈到优化时,您唯一应该做的就是对代码进行基准测试。如果它足够好,那么就不要更改您的代码。任何相反的意见都只是宗教/政治的,应该被忽略。如果您需要更好的性能,请分析您的代码以找到真正的瓶颈。这可能是瓶颈,也可能不是。不要优化不会减慢速度的代码。

在一天结束时,尽可能地编写最清晰、最易读的代码。