为何插入排序嵌套循环中把var改为let后无法正常运行?
为什么把插入排序嵌套循环的var j改成let j会报错?
核心原因就是var和let的作用域差异:
原代码里用
var j时,var是函数作用域变量,j在整个insertionSort函数范围内都能被访问。哪怕内部for循环执行完毕,循环外的arr[j+1] = currentVal;依然能拿到j的最终值(比如循环退出时j是-1,或者某个不满足循环条件的索引)。改成
let j后,let是块级作用域变量,j只在内部for循环的{}代码块里有效。当内部循环结束跳出这个块之后,外面的代码根本找不到j这个变量,直接抛出ReferenceError: j is not defined的错误。
修复方案
要想用let替代var又不报错,只需要把j的声明提到内部循环外面,让它的作用域覆盖到后面的赋值代码:
function insertionSort(arr){ let currentVal; for(let i = 1; i < arr.length; i++){ currentVal = arr[i]; let j = i - 1; // 把j的声明移到循环外,作用域包含后续代码 for(; j >= 0 && arr[j] > currentVal; j--) { arr[j+1] = arr[j] } arr[j+1] = currentVal; } return arr; } let hola = insertionSort([26,54,2,1,9,20,99,76,4]); console.log(hola);
这样j的作用域就覆盖了内部循环和后面的赋值语句,既能遵循let/const的最佳实践,又能保证插入排序逻辑正常运行。
内容的提问来源于stack exchange,提问作者rubensoon
相关产品推荐
相关产品推荐

