以下loop函数的出口返回值设置任何值都无效,函数都是返回undefined

/**
 *
 * @param {Number} number 循环次数
 * @param {Array} poi1
 * @param {Array} poi2
 * @param {Array} poi3
 * @param {Array} poi4
 * @param {Array} map1
 * @param {Array} map2
 * @param {Array} map3
 * @param {Array} map4
 * @param {Array} paraAr
 * @returns 二次步进一半得到三参
 */
function toHalf(
  number,
  poi1,
  poi2,
  poi3,
  poi4,
  map1,
  map2,
  map3,
  map4,
  paraAr
) {
  let offsetHalf1 = getDisOffset(poi1, map1);
  offsetHalf1 = [offsetHalf1[0] / 2, offsetHalf1[1] / 2];
  // 得到p1平移一半距离的新点
  let p1sHalf = getOffsetPoint(offsetHalf1, poi1); //
  let p2sHalf = getOffsetPoint(offsetHalf1, poi2);
  // 得到3参和旋转原点
  let obj3 = getBasefromLine([poi1, poi2, p1sHalf, p2sHalf], p1sHalf);
  paraAr.push({
    ...obj3,
    o: p1sHalf,
  });
//得到入口点转换后的点
  poi1 = getPoint(paraAr[paraAr.length - 1], poi1, paraAr[paraAr.length - 1].o);
  poi2 = getPoint(paraAr[paraAr.length - 1], poi2, paraAr[paraAr.length - 1].o);

  poi3 = getPoint(paraAr[paraAr.length - 1], poi3, paraAr[paraAr.length - 1].o);
  poi4 = getPoint(paraAr[paraAr.length - 1], poi4, paraAr[paraAr.length - 1].o);

  console.log("这是转换后最终的4点", poi1, poi2, poi3, poi4); //这是转换后最终的4点

  return loop(++number, poi1, poi2, poi3, poi4, map1, map2, map3, map4, paraAr);
}

/**
 *
 * @param {Number} num 循环次数,为5就4个点转一圈
 * @param {Array} p1 图片参考点
 * @param {Array} p2
 * @param {Array} p3
 * @param {Array} p4
 * @param {Array} m1 图片参考点对应的地图真实经纬度
 * @param {Array} m2
 * @param {Array} m3
 * @param {Array} m4
 * @param {Array} paraArray 三参数组
 * @returns 得到转换后的点 和三参进数组
 */
function loop(num, p1, p2, p3, p4, m1, m2, m3, m4, paraArray) {
  console.log("入口循环次数", num);

  if (num === 1) {
    console.log("if[1]循环次数", num);
    // 得到映射点
    const pxy1 = getPoint(paraArray[0], p1, paraArray[0].o);
    const pxy2 = getPoint(paraArray[0], p2, paraArray[0].o);
    const pxy3 = getPoint(paraArray[0], p3, paraArray[0].o);
    const pxy4 = getPoint(paraArray[0], p4, paraArray[0].o);
    return loop(++num, pxy1, pxy2, pxy3, pxy4, m1, m2, m3, m4, paraArray);
  } else if (num > 5) {
    console.log("if[6/6+]循环次数", num, "\n\t");
    return [p1, p2, p3, p4]; // 返回值这里无效,改成return 3,也是返回undefined
  } else {
    if ((num - 2) % 4 === 0) {
      console.log("if[2+4n]循环次数", num);
      if (num !== 2) {
        [p1, p3] = [p3, p1]; // 把上一循环参数的一三互换
        [p2, p4] = [p4, p2]; // 把上一循环参数的二四互换
        [m1, m3] = [m3, m1]; // 把上一循环参数的五七互换
        [m2, m4] = [m4, m2]; // 把上一循环参数的六八互换
        // console.log("转2,n !== 2 ", p1, p2, p3, p4, m1, m2, m3, m4);
      }
      // console.log("转2", p1, p2, p3, p4, m1, m2, m3, m4);
      toHalf(num, p2, p1, p4, p3, m2, m1, m4, m3, paraArray);
    }
    if ((num - 3) % 4 === 0) {
      console.log("if[3+4n]循环次数", num);
      [p1, p2] = [p2, p1]; // 把上一循环参数的一二互换
      [p3, p4] = [p4, p3]; // 把上一循环参数的三四互换
      [m1, m2] = [m2, m1]; // 把上一循环参数的五六互换
      [m3, m4] = [m4, m3]; // 把上一循环参数的七八互换还原
      // console.log("转3", p1, p2, p3, p4, m1, m2, m3, m4);

      toHalf(num, p4, p3, p2, p1, m4, m3, m2, m1, paraArray);
    }
    if ((num - 4) % 4 === 0) {
      console.log("if[4+4n]循环次数", num);
      [p1, p4] = [p4, p1]; // 把上一循环参数的一四互换
      [p2, p3] = [p3, p2]; // 把上一循环参数的二三互换
      [m1, m4] = [m4, m1]; // 把上一循环参数的五八互换
      [m2, m3] = [m3, m2]; // 把上一循环参数的六七互换还原
      // console.log("转4", p1, p2, p3, p4, m1, m2, m3, m4);

      toHalf(num, p1, p2, p3, p4, m1, m2, m3, m4, paraArray);
    }
    if ((num - 5) % 4 === 0) {
      console.log("if[5+4n]循环次数", num);
      // console.log("第4个坐标p3'", p3, "m3", m3);
      toHalf(num, p3, p4, p1, p2, m3, m4, m1, m2, paraArray);
    }
  }
}


const res = loop(
  1,
  picThree,
  picFour,
  picFive,
  picSix,
  mapThree,
  mapFour,
  mapFive,
  mapSix,
  paraArr
);
console.log(res); // 是undefined,为什么不是别的
阅读 1.4k
2 个回答

loop函数中调用toHalf时,前面增加return 关键字。
图片.png

那个 else 分支里也没返回值啊……

传入 num = 1,首先进入 if (num === 1) 分支,然后 ++num 递归;进递归里 num = 2,进入最后的 else 分支,然后就没有然后了……

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题