Javascript 何时分割 vs 何时嵌套

标签 javascript indentation

我想知道 javascript 开发者社区对于何时嵌套和何时分割代码有何看法

本质上可以说您正在 IIFE 中运行一些代码

为什么很多时候我会看到这样的东西

(function(context) {
    context.bang = {
        someTing: function() {
           //a lot of code
        },
        someTingElse: function() {
           //a lot of code
        }
    }
}(this));

对比

(function(context) {
    function doSomething() {
        // a lot of code
    }
    function doSomethingElse() {
        // a lot of code
    }
    context.bang = {
      someTing : doSomething,
      someTingElse : doSomethingElse
    }
}(this));

我发现第二段代码更具可读性,如果您希望将其压缩,请通过谷歌的闭包编译器之类的东西发送它,该编译器将采用代码的第二个版本并将其压缩为基本上您没有使用的第一个+技巧'想不到。代码由人维护,由编译器优化,由应用程序运行。

编辑:

虽然在这个例子中并不明显,但让我们跟上将子函数放入子函数中的趋势,而且我不关心什么比我的生活中的其他东西更重要,只要没有任何东西回到 context 中即可。

但沿着同样的趋势,我看到的大多数实际最终代码的最终结果是这样的

(function(context) {
    context.bang = {
        someTing: function() {
           return {
               another: function() {
                  return {
                     yetAnotherFunction: function() {
                        return true;
                     }
                  }
               }
           };     
        }
    }
}(this));

其中每个函数级别的深度不仅仅是我在这里制作的一两行函数 而不是

(function(context) {
    function yetAnotherFunction() {
       return true;
    }
    function another() {

       return yetAnotherFunction;
    }
    function someTing() {
       /*blahblahblah*/
       return another;
    }
    context.bang = {
        someTing: someTing
    }
}(this));  

最佳答案

在许多情况下,它们是等效的,这只是个人喜好问题。

从语义上讲,第一个使用 function expressions而第二个使用 function declarations ,所以第二个得到 hoisting .

但是,主要区别在于每个函数必须访问另一个函数的选项。将它们与Object 分开,将 IIFE 用作 closure允许他们以本地人的身份接触另一个人:

(function(context) {
    function doSomething() {
        // ...
    }
    function doSomethingElse() {
        doSomething();
    }
    // ...
}(this));

但是,他们总是可以假设this也将是一个合适的对象:

(function(context) {
    context.bang = {
        someTing: function() {
            // ...
        },
        someTingElse: function() {
            this.someTing();
        }
    }
}(this));

this 可能并不总是定义的Object,但它是所需的东西。

旁注:当已经需要 Expression 时,function 表达式周围的括号不是必需的,例如在 : 之后对象文字。

<小时/>

关于您的编辑:

嗯,它不再仅仅关乎风格和可读性。现在是关于预期的逻辑,这是必要的。

使用第二个(或第四个)代码片段,每个函数都会返回对另一个已存在函数的引用。

this.someTing() === this.someTing(); // true

但是,对于第一个(或第三个),对其中任何一个的每次调用都会根据相同的定义创建一个新函数。

this.someTing() === this.someTing(); // false

有时,需要根据特定定义创建新函数(同样: Closures )。其他时候,这可能只是浪费资源。

关于Javascript 何时分割 vs 何时嵌套,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18263807/

相关文章:

javascript - JavaScript 中的竞争条件与复合赋值

这些C代码可以这样重构吗?

ruby - Emacs ruby​​ 模式缩进行为

git - 将我在提交中更改的行中的空格转换为制表符

javascript - 输入光标在输入事件时跳转到输入字段的末尾

javascript - [0] 在 $ ("#id")[0] 中做了什么?

javascript - 如何使用 Javascript D3 将单列 CSV 文件导入到饼图中?

HTML + CSS : Indent a paragraph after icon

haskell - 为什么我不应该混合制表符和空格?

javascript - 为什么我的时钟不能第二次停止-为什么clearInterval不能第二次工作(javascript)