是在if语句内还是在if语句外声明变量更好呢?

Is it better practice to declare variables inside an if statement or outside?

本文关键字:语句 if 变量 更好 声明 是在      更新时间:2023-09-26

我正在清理一些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;
}

根据这个问题,它们都具有相同的功能,但是哪个是更好的代码?

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

这个的情况下,我将使用三进制,并完全跳过问题,因为这段代码很短。或者我不去管它,因为重写的代码比较长,而且(不一定)没有添加太多的上下文(但是关于更长的函数,请参见下文)。

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

在较长的函数中,您必须扫描(读:考虑太多)声明,确保范围合理,并确保在初始化(在此代码片段中)之前不会意外引用变量

正如@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. found: a variable percent_downloads;检查作用域,是否存在,如果是忽略否则创建变量。查看更多ref:嵌套作用域

  2. 执行:代码

最后代码被执行为:

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