js中使let关键字报错,改用var关键字解决

js中使let关键字报错,改用var关键字解决-LMLPHP

项目场景:

使用 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 变量就可以在整个函数中使用。

js中使let关键字报错,改用var关键字解决-LMLPHP

总结

个人觉得使用 let 代替 var 声明可以使代码更加规范。

04-07 00:14