项目场景:
使用 let 关键字报错,报错信息为:
Uncaught ReferenceError: maxNum is not defined at getMaxNum (4-3.html:17:17)
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title></title>
</head>
<body>
<script>
function getMaxNum(){
for (var i = 0; i < arguments.length; i++) {
let maxNum = -1
if (maxNum < arguments[i]) {
maxNum = arguments[i]
}
}
return maxNum
}
console.log(getMaxNum(1, 10, 5));
</script>
</body>
</html>
问题描述
改用var声明又不会报错了
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title></title>
</head>
<body>
<script>
function getMaxNum(){
for (var i = 0; i < arguments.length; i++) {
var maxNum = -1
if (maxNum < arguments[i]) {
maxNum = arguments[i]
}
}
return maxNum
}
console.log(getMaxNum(1, 10, 5));
</script>
</body>
</html>
原因分析:
在 JavaScript 中,使用 let 声明的变量具有块级作用域,而使用 var 声明的变量则具有函数级作用域。在代码中,let maxNum = -1
语句位于 for 循环的内部,这意味着 maxNum
变量的作用域仅限于 for 循环内部。因此,在 for 循环外部(例如在 return 语句之后)尝试访问 maxNum
变量会导致 “maxNum is not defined
” 的错误。
而当你使用 var 声明时,变量的作用域是整个函数,所以 var 声明的 maxNum
变量在整个函数范围内都是可见的,这就解释了为什么使用 var 就不会报错了。
并且 let maxNum = -1
语句位于循环内部,每次迭代时都会重新声明并初始化 maxNum
变量。这意味着在每次循环迭代时,maxNum
的值都会被重置为-1
解决方案:
如果你希望使用 let 声明并且避免出现报错,只需将 let maxNum = -1
移动到 for 循环外部即可,使其作用域覆盖整个函数。这样,maxNum 变量就可以在整个函数中使用。
总结
个人觉得使用 let 代替 var 声明可以使代码更加规范。