我的函数在增强for循环中正常运行,普通for循环却失效问题咨询
问题原因分析
你的普通for循环失效的核心问题很简单:你没有调用传入的函数,只是把函数本身赋值给了变量,导致后续的循环逻辑完全基于错误的对象执行。
具体细节:
let winNum = getWinningNumbers;这行代码并没有执行getWinningNumbers函数,而是把这个函数对象直接赋值给了winNum变量。此时winNum是函数,不是你期望的中奖数字数组。- 函数对象的
length属性代表的是它的形参个数(你的getWinningNumbers没有形参,所以winNum.length等于0),普通for循环的条件i < 0永远不成立,循环体根本不会执行,自然无法检测到数字匹配。 - 至于增强for循环能运行,大概率是你在增强for循环里不小心正确调用了函数(比如写了
for (num of getWinningNumbers())),所以能拿到正确的数组进行遍历。
解决办法
只需要给函数加上调用的括号,让它们执行并返回你需要的数值/数组即可,同时可以优化一下代码逻辑:
修正后的完整代码
function getCustomerNumber() { let customerNumbers = 312; return customerNumbers; } function getWinningNumbers() { let winningNumbers = []; winningNumbers.push(12,17,24,37,38,43); return winningNumbers; } function checkNumbers(getCustomerNumber, getWinningNumbers) { let match = false; let text; // 关键:调用函数获取返回值,而不是赋值函数本身 let winNum = getWinningNumbers(); let cusNum = getCustomerNumber(); // 普通for循环修正后可以正常运行 for (let i = 0; i < winNum.length; i++) { if(winNum[i] === cusNum) { match = true; break; // 找到匹配后直接跳出循环,提升效率 } } // 或者用数组的includes方法简化代码,更简洁 // match = winNum.includes(cusNum); // 后续可以根据match的值处理text逻辑 text = match ? "恭喜中奖!" : "未中奖,请再接再厉!"; console.log(text); return match; } // 调用测试 checkNumbers(getCustomerNumber, getWinningNumbers);
关键修正点
- 把
let winNum = getWinningNumbers;改为let winNum = getWinningNumbers();,加上()才会执行函数并返回数组。 - 同理,
let cusNum = getCustomerNumber;改为let cusNum = getCustomerNumber();,获取到正确的客户号码312。 - 可选优化:找到匹配后用
break终止循环,避免不必要的遍历;或者直接使用数组的includes()方法替代for循环,代码更简洁易读。
内容的提问来源于stack exchange,提问作者Michael Wright
相关产品推荐
相关产品推荐

