对于带有和不带花括号的循环,filter方法的工作方式不同?

时间:2016-08-27 15:35:11

标签: javascript for-loop

我的代码中有这个for循环,没有大括号(需要几个小时才弄清楚),在forScope的函数中,它不适用于花括号。我想知道为什么?

function destroyer(arr) {
// Remove all the values
a=[];
for(var b=0; b<arguments.length; b++ ) {
a.push(arguments[b]);
}

function forTheScope(item) {
debugger;
for (var m = 1; m < a.length; m++) // this for loop works
  if (item == a[m]) // but when i put curly braces, it doesn't?
    return false;  //
return true; //
}

/*===== This is the for loop with braces =====
function forTheScope(item) {
debugger;
for (var m = 1; m < a.length; m++) {
  if (item == a[m]) {
   return false;  
  } else {
   return true;
  }
}
}
========== End of the loop ==========*/

return a[0].filter(function filterArray(item,index,array) {
return forTheScope(item);
});
}

destroyer([1, 2, 3, 1, 2, 3], 2, 3);

1 个答案:

答案 0 :(得分:2)

此代码:

for (var m = 1; m < a.length; m++)
  if (item == a[m])
    return false;
return true;

被解释为完全像是这样写的:

for (var m = 1; m < a.length; m++) {
  if (item == a[m])
    return false;
}
return true;

for循环标头在语法上后跟一个语句。反过来,if语句填补了这一要求。但是,将整个事物包裹在{ } 也会创建一个单一的&#34;复合物&#34;言。

当然,如果以其他方式添加{ },那么事情会有所不同。

编辑 - 好了,既然你已经更新了问题以包含错误的版本,那就明白了它的区别。您的代码与工作版本的特定且非常重要的方式不同,它实际上与{ }无关。问题是else

for (var m = 1; m < a.length; m++) {
  if (item == a[m]) {
   return false;  
  } else {
   return true;
  }
}

您已将return true移到else子句中,所以现在它循环中而非外部。在工作版本中,或者在上面带有{ }的我的版本中,它在循环之外,因此在循环完成之前不会发生(除非循环以return false;退出第一)。

在您的版本中,循环的第一次迭代将使用return false;退出函数,否则它将以return true;退出。循环永远不会比第一次迭代更进一步。