Javascript 有人能解释为什么返回值是第一个示例吗?第二个例子很好

Javascript 有人能解释为什么返回值是第一个示例吗?第二个例子很好,javascript,Javascript,有人能解释为什么返回值是第一个示例吗?第二个例子很好 例:1 function mul(a,...b){ for (var i=0; i<b.length; i++); return b[i] *= a; } 函数mul(a,…b){ 对于(var i=0;i,因为在第一个示例中b[i]是未定义的 假设您在长度为3的数组上循环。在循环中,索引i覆盖:0、1、2 但是,在循环的最后一次迭代之后,i再次递增,现在是3。当您尝试访问b[3]时,如果b的长度为3,则它是未定义的。在数学运

有人能解释为什么返回值是第一个示例吗?第二个例子很好

例:1

function mul(a,...b){
  for (var i=0; i<b.length; i++);
  return b[i] *= a;
}
函数mul(a,…b){

对于(var i=0;i,因为在第一个示例中
b[i]
未定义的

假设您在长度为3的数组上循环。在循环中,索引
i
覆盖:0、1、2

但是,在循环的最后一次迭代之后,
i
再次递增,现在是
3
。当您尝试访问
b[3]
时,如果
b
的长度为3,则它是未定义的。在数学运算中使用未定义会产生
NaN

for (var i=0;i<b.length;i++); // i loops from 0 to the length of the array
return b[i]*=a; // i is now outside the bounds of the array

for(var i=0;i运行此代码并观察其结果

mul(2,1,2);
函数mul(a,…b){

对于(var i=0;i来说,发生了什么并不明显,因为第一个示例中有一个分号,而第二个示例中没有

function mul(a,...b){
  for (var i=0; i<b.length; i++); <=== this one
  return b[i] *= a;
}
等效代码为:

function mul(a,...b){
  for (var i=0; i<b.length; i++) {
    // empty block
  }
  return b[i] *= a;
}
function mul(a,...b){
  for (var i=0; i<b.length; i++) {
    b[i] *= a;
  }
  return b;
}
函数mul(a,…b){

对于(var i=0;i@David-JavaScript什么时候得到了基于块的作用域?
i
不在作用域之外,它在范围之外。处理完返回语句后,
i
的值为3,
b[3]
is
NaN
@PM77-1:这一点很好。我刚刚学到了一些关于JavaScript的新知识。虽然我可能仍然会在代码中保留基于块的直观范围,只是为了保持代码清晰:)稍微格式化可能会有帮助,括号会帮助更多。@PM77-1-ECMAScript自从第6版引入以来就有了块范围(又名ECMASCript 2015)。使用console.log比使用alert更方便用户。
function mul(a,...b){
  for (var i=0; i<b.length; i++)  <=== no semicolon
    b[i] *= a;                    <=== so this statement is the block
  return b;
}
function mul(a,...b){
  for (var i=0; i<b.length; i++) {
    b[i] *= a;
  }
  return b;
}