我的代码中有这个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);
答案 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;
退出。循环永远不会比第一次迭代更进一步。