【问题标题】:Variable is already defined with local variables? How?变量已经用局部变量定义了吗?如何?
【发布时间】:2018-10-16 14:52:03
【问题描述】:

这是我检查注册页面的代码。它说变量ij 已经定义,尽管它是局部变量而不是全局变量。在这种情况下我能做什么?如何在本地而不是全局制作变量?非常感谢您的帮助,我是计算机科学专业的新学生。

function checkName() { // בודק על
    var n = document.getElementById("FullName").value;
    var len = n.length;
    var no = "!@#$%^&*()-_+=\'|][}{><./,;:?,";
    var num = "0123456789";
    if (n == "") {
        document.getElementById("errName").innerHTML = "רשום את השם בבקשה";
        return false;
    }
    for (var i = 0; i < n.length; i++) {
        if (n.charAt(i) == " ") {
            len--;
        }
    }
    if (len < 2) {
        document.getElementById("errName").innerHTML = "לא הגיוני שם עם אות אחת";
        return false;
    }
    for (var i = 0; i < n.length; i++) {
        if (n.charAt(i) >= "a" && n.charAt(i) <= "z") {
            document.getElementById("errName").innerHTML = "לא הגיוני שם עם אותיות באנגלית";
            return false;
        }
    }
    for (var i = 0; i < no.length; i++) {
        for (var j = 0; j < n.length; j++) {
            if (no.charAt(i) == n.charAt(j)) {
                document.getElementById("errName").innerHTML = "אסור תווים מיוחדים";
                return false;
            }
        }
    }
    for (var i = 0; i < num.length; i++) {
        for (var j = 0; j < n.length; j++) {
            if (num.charAt(i) == n.charAt(j)) {
                document.getElementById("errName").innerHTML = "אסור מספרים";
                return false;
            }
        }
    }
    for (var i = 0; i < 3; i++) {
        if (n[i] == ' ') {
            document.getElementById("errName").innerHTML = "אסור רווחים בהתחלה";
            return false;
            if (n[i + 1] == ' ') {
                document.getElementById("errName").innerHTML = "אסור רווחים בהתחלה";
                return false;
            }
        }
    }
    document.getElementById("errName").innerHTML = "";
    return true;
}

【问题讨论】:

  • 只需添加 var i, j; 并在您的 for 循环中,将 var i = 0 替换为 i = 0 并将 var j = 0 替换为 j = 0。它告诉你的是,你在每个 for 循环中都重新声明了 var i = 0,而变量 i 已经在第一个循环中声明了。 j也是如此。它与“全局”变量无关,而是由于在几个不同的循环中具有相同名称而导致的局部冲突。您可以在 var num 行之后添加这些声明。
  • 好的,伙计们,我在开始时声明了 I, J 并删除了 var,现在它可以工作了,谢谢。
  • 用 var 重新声明不应该抛出。我不明白上面的代码会如何抛出。我假设一些没有进一步提及的 linter,JSHint 出现在 google 中。
  • 两次声明同一个变量实际上并不是一个错误,无论如何。这只是一种不好的做法,会使您的代码混乱。 (大概您发布此内容是因为您的 IDE 将其突出显示为一个问题。)
  • "它说变量 'i' 和 'j' 已经定义了" - 谁在说这个,在哪里?你在使用 linter 吗?

标签: javascript


【解决方案1】:

Javascript 有function scope,因此在函数中使用var 定义任何变量都会使其存在于整个函数中。

在每个for 循环中,您将i 重新定义为var i = 0。例如:

for (var i = 0; i < n.length; i++) {
    if (n.charAt(i) == " ") {
        len--;
    }
}
...

for (var i = 0; i < num.length; i++) {
    for (var j = 0; j < n.length; j++) {
        if (num.charAt(i) == n.charAt(j)) {
            document.getElementById("errName").innerHTML = "אסור מספרים";
            return false;
        }
    }
}

您可以改为在函数顶部添加var i;,并在循环中简单地说i=0,因此您不必多次定义它。

考虑使用let in newer JS versions

【讨论】:

    【解决方案2】:

    尝试使用新的 ES6 let 而不是 var 在函数/项目中声明变量。 这将解决您的全局名称范围问题。 你可以在这里阅读更多内容https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/let

    【讨论】:

      【解决方案3】:

      您需要查看function scoping。由于var 具有定义它的功能范围。

      所以在你的情况下variable i 可以访问checkName 函数。使用let 将帮助您解决上述情况。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2013-07-16
        • 2015-01-02
        • 1970-01-01
        • 2019-10-01
        • 1970-01-01
        • 2015-04-29
        • 1970-01-01
        相关资源
        最近更新 更多