我正在清理一些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,它们都具有相同的功能,但哪种代码更好?
答案 0 :(得分:2)
这是基于意见的,有关JavaScript范围的众所周知的技术警告。但是,这条评论对评论来说太长了。
在这个的情况下,我会使用三元组,并完全跳过这个问题,因为这段代码很短。或者我不管它,因为重写时间较长并且(不一定)添加了很多上下文(但请参阅下面有关更长功能的内容)。
在适当短暂的功能中,我不相信它非常重要。在函数顶部声明变量的原因是因为它的声明最终 ,并且它避免了关于作用域规则和初始化点的任何混淆。
在较长的函数中,您必须扫描(读取:想太多)声明,确保确定范围确定性,并确保在初始化之前不会意外引用变量(其中)它就在这个片段中。)
答案 1 :(得分:1)
正如@Dave Newton所说"这个评论太长了,不能发表评论。"试着以简单的方式解释它。
JavaScript没有块范围的功能。 Ref
在执行代码的任何部分之前,首先处理所有声明,包括变量和函数。 Hoisting-Ref
您的代码
if (users_assigned != 0) {
var percent_downloads = total_downloads / users_assigned;
} else {
var percent_downloads = 0;
}
JS引擎如何解释
发现:变量percent_downloads;
检查范围,是否存在,如果是,则忽略其他创建变量。 For More ref: Nested Scope
执行:代码
最后代码执行为:
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