我应该将函数嵌套在允许我执行此操作的语言中还是应该避免使用它?


12

在JavaScript,PL / SQL和其他一些语言中,函数可以嵌套,即在另一个函数中声明。这可用于将大型功能分解为较小的部分,但将这些部分保留在较大功能的范围内。

function doTooMuch() {
    function doSomething () {
       ...
    }
    function doSomethingElse() {
       ...
    }
    function doYetAnotherThing() {
       ...
    }

    // doTooMuch body

    doSomething();
    doSomethingElse();
    doYetAnotherThing();
}

在某些情况下,当那些较小的函数不使用较大函数的局部变量时,可以很容易地将其更改为所有函数都未嵌套的版本。

function doSomething () {
   ...
}
function doSomethingElse() {
   ...
}
function doYetAnotherThing() {
   ...
}
function doTooMuch() {
    doSomething();
    doSomethingElse();
    doYetAnotherThing();
}

假定这些嵌套函数不在其他任何地方使用,是将它们保留在大型函数的上下文中还是更好,还是不好,因为这正是使大型函数变大,变大的原因?

Answers:


8

这是一个见解,但是我将避免嵌套函数,除非它实际上是设计中必要且刻意的一部分。

在大多数语言中,当嵌套函数时,最终会产生某种机械效果。最常见也是最有趣的是,关闭可以在体内使用的变量的词法范围,但是其他一些时间(例如,函数的可见性)也会出现。

如果使用得当,它们通常是很棒的工具-但是它们是复杂的工具,因为当您初看代码时,它们可能会导致非本地或非显而易见的效果。

如果您不使用它们,许多人将阅读该代码而看不到任何内容,因此会假设他们错过了它,然后再看一遍,试图找出您这样做的原因,而不是在单独的范围内。

您还冒着将来的程序员不注意那里的风险而故意或什至意外关闭他们不想要的内容的风险。

最后,如果您的函数声明在封闭函数的范围之外声明了一个命名函数,请避免使用它。这让每个人都感到困惑。

关于最后的注释:由于单个函数有助于分隔代码,因此嵌套函数比单个巨型函数要麻烦的多,但最终确实意味着要阅读更多的代码以供理解doTooMuch()-特别是如果您可以在嵌套函数声明之间隐藏代码,或者需要检查没有人做。


-1:Javascript不是“大多数语言”。用Javascript嵌套函数是正常做法。
凯文·克莱恩

2
JavaScript中的@kevincline嵌套函数是一种常见的不良习惯
Raynos 2012年

@Raynos:如果不嵌套它们,您将把它们放在哪里?您不是包含它们的类。这是一些典型的代码:jquery(function($){ $('#id').click(function(){...}); }
凯文·克莱恩

@kevincline ...对于菜鸟来说,典型的代码是,您需要将函数嵌套一层。那是因为javascript没有模块作用域,所以您需要匿名闭包。
雷诺斯

如果该单击执行Ajax调用,并带有完成回调?现在,您具有嵌套两个级别的函数。当然,您可以通过将匿名闭包分配给变量来限制嵌套。那真的更好吗?
凯文·克莱恩

2

这是没有正确答案的问题之一,诸如“个人偏爱”,“团队实践”之类的词浮现在脑海。在我看来,未在任何地方使用的小函数(现在是另一种主观的东西)属于其父函数内部,尤其是当它们可以不命名时。


0

这个问题没有正确的答案,因为这两种选择都不会使封装最大化。如果嵌套它们,它们仍然可以访问不应访问的变量。如果您不这样做,则其他功能可以访问它们不应该访问的功能。不管怎样,你输了。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.