在if语句或外部声明变量是更好的做法吗?

时间:2014-07-10 17:12:48

标签: javascript optimization coding-style

我正在清理一些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,它们都具有相同的功能,但哪种代码更好?

2 个答案:

答案 0 :(得分:2)

这是基于意见的,有关JavaScript范围的众所周知的技术警告。但是,这条评论对评论来说太长了。

这个的情况下,我会使用三元组,并完全跳过这个问题,因为这段代码很短。或者我不管它,因为重写时间较长并且(不一定)添加了很多上下文(但请参阅下面有关更长功能的内容)。

在适当短暂的功能中,我不相信它非常重要。在函数顶部声明变量的原因是因为它的声明最终 ,并且它避免了关于作用域规则和初始化点的任何混淆。

在较长的函数中,您必须扫描(读取:想太多)声明,确保确定范围确定性,并确保在初始化之前不会意外引用变量(其中)它就在这个片段中。)

答案 1 :(得分:1)

正如@Dave Newton所说"这个评论太长了,不能发表评论。"试着以简单的方式解释它。

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

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

  3. 您的代码

    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. 执行:代码

    3. 最后代码执行为:

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

      所以,他们都具有同等的功能。

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

      案例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