为什么这两段代码返回不同的值?

时间:2015-03-17 17:31:03

标签: javascript if-statement scope

我通过在线书籍#34; Eloquent JavaScript"来学习Javascript。 - 顺便说一句,这是一个很棒的资源。我在数据结构章节中遇到了这个函数:

function tableFor(event,journal){
var table = [0,0,0,0]; 
for (var i = 0; i < journal.length; i++){
    var entry = journal[i], index = 0;
    if (hasEvent(event,entry)) index += 1; 
    if (entry.squirrel) index += 2; 
        table[index] += 1;
    }
return table;
}

正如您所看到的,它遍历一个数组,并根据第一个对象具有参数的次数输出另一个数组:event。我重写了这个略有不同的......

function tableFor(event,journal){
var table = [0,0,0,0];
for (var i = 0; i < journal.length; i++){ 
    var entry = journal[i], index = 0;
    if (hasEvent(event,entry)){
        index += 1;
        }
    if (entry.squirrel){
        index += 2; 
        table[index] += 1;
        }
}
return table;
}

唯一的变化是if语句的括号,我认为这是最佳实践。但是,它从第一段代码输出不同的值。为什么会这样?是否有一些我不理解的范围问题?如果你不知道我在说什么,可以在这里找到书中章节的链接:Eloquent JavaScript 以及对象JOURNAL:JavaScript Object

的链接

感谢您的帮助!

4 个答案:

答案 0 :(得分:2)

在原始代码中,这个:

if (entry.squirrel) index += 2; 
    table[index] += 1;

实际上是两个不相关的陈述:

if (entry.squirrel) { index += 2; }
table[index] += 1;

它刚刚缩进。在Javascript中,与大多数C派生语言一样,if之后的单个语句可以构成条件为真时要执行的块。要包含多个语句,必须使用大括号。

答案 1 :(得分:2)

如果没有括号的 if 语句只会在满足条件时执行下一条指令。

您提供的第一个代码段包含令人困惑的缩进,因为它表明以下指令(&#34; table [index] + = 1;&#34;)是条件语句的一部分,但在JavaScript中缩进是无关紧要的。< / p>

所以实际上,如果你不使用括号,那么第一个分号表达式就是闭括号。

正确缩进代码:

function tableFor(event,journal){
    var table = [0,0,0,0]; 
    for (var i = 0; i < journal.length; i++){
        var entry = journal[i], index = 0;

        if (hasEvent(event,entry)) index += 1; 
        if (entry.squirrel) index += 2; 

        table[index] += 1;
   }

   return table;
}

带括号

function tableFor(event,journal){
    var table = [0,0,0,0]; 
    for (var i = 0; i < journal.length; i++){
        var entry = journal[i], index = 0;

        if (hasEvent(event,entry)) {
            index += 1
        }; 

        if (entry.squirrel) {
            index += 2
        }; 

        table[index] += 1;
   }

   return table;
}

答案 2 :(得分:1)

您已将表[index] + = 1;&#39;在if语句中,它之前没有。原始代码中的标签给出了一种误导性的印象,但原始的未加括号的if语句仅包含&#39;周围&#39;指数+ = 2;&#39;

答案 3 :(得分:1)

这是因为您将括号放在错误的位置。它应如下所示:

function tableFor(event,journal){
var table = [0,0,0,0];
for (var i = 0; i < journal.length; i++){ 
var entry = journal[i], index = 0;
if (hasEvent(event,entry)){
    index += 1;
    }
if (entry.squirrel){
    index += 2; 
    }
    table[index] += 1;
}
return table;

table [index]行不属于if语句。