Javascript 在if语句内部或外部声明变量更好吗?

Javascript 在if语句内部或外部声明变量更好吗?,javascript,optimization,coding-style,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 per

我正在清理一些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范围的众所周知的技术警告。不过,此评论太长,无法发表评论

在本例中,我将使用一个三元组,完全跳过这个问题,因为这段代码很短。或者我不去管它,因为重写的时间更长,并且(不一定)添加了太多的上下文(但请参见下面关于更长函数的内容)

在适当的短时间内,我不认为这很重要。在函数顶部声明变量的原因是,不管怎样,变量的声明就是在这里结束的,它避免了关于范围规则和初始化点的任何混淆


在较长的函数中,您必须扫描(读:想得太多)声明,确保范围健全,并确保在初始化变量之前(在本代码段中)没有意外引用该变量。

这是基于观点的,关于JavaScript范围的众所周知的技术警告。不过,此评论太长,无法发表评论

在本例中,我将使用一个三元组,完全跳过这个问题,因为这段代码很短。或者我不去管它,因为重写的时间更长,并且(不一定)添加了太多的上下文(但请参见下面关于更长函数的内容)

在适当的短时间内,我不认为这很重要。在函数顶部声明变量的原因是,不管怎样,变量的声明就是在这里结束的,它避免了关于范围规则和初始化点的任何混淆


在较长的函数中,您必须扫描(读:想得太多)声明,确保范围健全,并确保在初始化变量之前(在本代码段中)没有意外引用该变量。

这是基于观点的,关于JavaScript范围的众所周知的技术警告。不过,此评论太长,无法发表评论

在本例中,我将使用一个三元组,完全跳过这个问题,因为这段代码很短。或者我不去管它,因为重写的时间更长,并且(不一定)添加了太多的上下文(但请参见下面关于更长函数的内容)

在适当的短时间内,我不认为这很重要。在函数顶部声明变量的原因是,不管怎样,变量的声明就是在这里结束的,它避免了关于范围规则和初始化点的任何混淆


在较长的函数中,您必须扫描(读:想得太多)声明,确保范围健全,并确保在初始化变量之前(在本代码段中)没有意外引用该变量。

这是基于观点的,关于JavaScript范围的众所周知的技术警告。不过,此评论太长,无法发表评论

在本例中,我将使用一个三元组,完全跳过这个问题,因为这段代码很短。或者我不去管它,因为重写的时间更长,并且(不一定)添加了太多的上下文(但请参见下面关于更长函数的内容)

在适当的短时间内,我不认为这很重要。在函数顶部声明变量的原因是,不管怎样,变量的声明就是在这里结束的,它避免了关于范围规则和初始化点的任何混淆

在较长的函数中,您必须扫描(读:想得太多)声明,确保范围健全,并确保在初始化变量之前(在本代码段中)没有意外引用该变量。

正如@Dave Newton所说,“但此注释对于注释来说太长了。”试着用一种简单的方式来解释它

  • JavaScript没有用于块作用域的功能

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

  • 您的代码

    if (users_assigned != 0) {
        var percent_downloads = total_downloads / users_assigned;
    } else {
        var percent_downloads = 0;
    }
    
    JS引擎如何解释它

    if (users_assigned != 0) {
        var percent_downloads = total_downloads / users_assigned;
    } else {
        var percent_downloads = 0;
    }
    
  • 找到:一个变量
    下载百分比检查范围,是否存在,如果是,忽略其他创建变量

  • 执行:代码

  • 最后,代码被执行为:

    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
    
    正如@Dave Newton所说,“不过,这条评论太长了。”他试图用一种简单的方式解释它

  • JavaScript没有用于块作用域的功能

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

  • 您的代码

    if (users_assigned != 0) {
        var percent_downloads = total_downloads / users_assigned;
    } else {
        var percent_downloads = 0;
    }
    
    JS引擎如何解释它

    if (users_assigned != 0) {
        var percent_downloads = total_downloads / users_assigned;
    } else {
        var percent_downloads = 0;
    }
    
  • 找到:一个变量
    下载百分比检查范围,是否存在,如果是,忽略其他创建变量

  • 执行:代码

  • 最后,代码被执行为:

    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
    
    正如@Dave Newton所说,“不过,这条评论太长了。”他试图用一种简单的方式解释它

  • JavaScript没有用于块作用域的功能

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

  • 您的代码