【问题标题】:Is it better practice to declare variables inside an if statement or outside? [closed]在 if 语句内部或外部声明变量是更好的做法吗? [关闭]
【发布时间】:2014-07-10 17:12:47
【问题描述】:

我正在清理一些 Javascript 代码,用于计算有多少人下载了已分配下载的内容。我遇到了这个简单的声明:

var percent_downloads = 0;
if (users_assigned != 0) {
   percent_downloads = total_downloads / users_assigned;
}

我正在考虑重写代码以在 if-else 语句中声明变量,如下所示:

if (users_assigned != 0) {
    var percent_downloads = total_downloads / users_assigned;
} else {
    var percent_downloads = 0;
}

根据this question,它们的功能相同,但哪个代码更好?

【问题讨论】:

  • 我认为这更像是一种偏好。但是,我认为,在使用它之前声明它(即使没有 var percent_downloads;)是一种更常见的方法。
  • 这是一个范围问题。如果变量除了在if 中声明和初始化之外没有任何用处,那么拥有它就没有任何意义,而且好的编译器甚至会优化该代码。 “更好”是主观的,但在所有条件相同的情况下,您使用的文本越少,代码的可读性和可理解性就变得一目了然
  • @fnostro 除了JS中只有两个作用域外,变量存在于if语句之外因为吊装。当let 语句得到更好的支持时,这将不太正确。
  • 还要考虑var percent_downloads; if(…) percent_downloads = …; else percent_downloads = …;var percent_downloads = (…) ? … : …;
  • @DaveNewton:在 JS 中提升是不幸的,它违背了自然的可读性。在 OP 示例中,假设 percent_downloads 在其他地方使用,第二个示例可能是 JS 合法的,但实际上并没有传达意图。 IMO,最好把代码写成范围是一个因素,即使在 JS 中也是如此。

标签: javascript optimization coding-style


【解决方案1】:

这是基于意见的,有关于 JavaScript 作用域的众所周知的技术警告。不过,这条评论太长了,无法评论。

this 的情况下,我会使用三元组,并完全跳过这个问题,因为这段代码很短。或者我会不理会它,因为重写时间更长并且不会(必然)添加太多上下文(但请参阅下文关于更长的功能)。

在适当简短的函数中,我不认为它非常重要。在函数顶部声明变量的原因是因为这是它们的声明结束的地方无论如何,它避免了关于范围规则和初始化点的任何混淆。

在较长的函数中,您必须扫描(阅读:想太多)声明,确保范围合理,并确保在变量初始化之前不会意外引用变量(这它在这个 sn-p 中)。

【讨论】:

    【解决方案2】:

    正如@Dave Newton 所说,“不过,这条评论对于评论来说太长了。”试着用简单的方式解释一下。

    1. JavaScript 没有用于块范围的功能。 Ref

    2. 在执行代码的任何部分之前,首先处理所有声明,包括变量和函数。 Hoisting-Ref

    您的代码

    if (users_assigned != 0) {
        var percent_downloads = total_downloads / users_assigned;
    } else {
        var percent_downloads = 0;
    }
    

    JS引擎是如何解释的

    1. 找到:一个变量percent_downloads; 检查范围,是否存在,如果是则忽略,否则创建变量。 For More ref: Nested Scope

    2. 执行:代码

    最终代码被执行为:

    if (users_assigned != 0) {
        percent_downloads = total_downloads / users_assigned;
    } else {
        percent_downloads = 0;
    }
    

    因此,它们的功能相同。

    还有一个例子,请查看代码中的 cmets 以便更好地理解

    案例 1

    var foo = true;
    console.log(bar)//found a variable not declared yet - create&set value as undefined
    if (foo) {
        var bar = foo * 2;  //already declared set new value
        console.log( bar ); //print new value
    }
        console.log( bar ); //print new value
    //output
    //undefined
    //2
    //2
    

    案例 2

    var foo = false;
    console.log(bar)//found a variable not declared yet - create&set value as undefined
    if (foo) {
        var bar = foo * 2; //code skipped - value is undefined
        console.log( bar ); //code skipped - value is undefined
    }
        console.log( bar );  //value is undefined
    //output
    //undefined
    //undefined
    //undefined
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-12-25
      • 1970-01-01
      • 2012-02-06
      • 2015-09-14
      • 1970-01-01
      • 1970-01-01
      • 2016-04-25
      相关资源
      最近更新 更多