我可以在Javascript的局部函数中访问全局变量吗?

我可以在Javascript的局部函数中访问全局变量吗?,javascript,html,Javascript,Html,我正在尝试访问变量name、email、pass,但每次尝试访问时,User.name、User.email\u ID和User.PASSWORD的值都为空。难道我不能全局使用这3个变量吗 <html> <head><title>Document</title></head> <body bgcolor="yellow"> <input type="text" id=&quo

我正在尝试访问变量name、email、pass,但每次尝试访问时,User.name、User.email\u ID和User.PASSWORD的值都为空。难道我不能全局使用这3个变量吗

<html>
<head><title>Document</title></head>
<body bgcolor="yellow">
  <input type="text" id="name"><br>
  <input type="email" id="mail"><br>
  <input type="password" id="pass"><br>
  <button onclick="Register()">Register</button>
  <button onclick="Show()">Show in console</button> <br>
  <div id="view" style="background-color: red; color:white; font-family: algerian; text-align: center;"></div>
  <script>
  const student=[];

  var name= document.getElementById("name").value;
  var mail= document.getElementById("mail").value;
  var pass= document.getElementById("pass").value;

  var Register = function() {
      let User=JSON.parse(`{"NAME":"`+name+`", "EMAIL_ID":"`+mail+`", "PASSWORD":"`+pass+`"}`);
      console.log(User);
      student.push(User);
  }

  function Show() {
      setTimeout(function() {
          let n=student.length; 
          var text="";
          for (let i = 0; i < n; i++) {
              text=text+"Name="+student[i].NAME+", Email="+student[i].EMAIL_ID+", Password="+student[i].PASSWORD+"<br>";
          }
          document.getElementById("view").innerHTML=text;
    }, 2000);
      }
  </script>
</body>
</html>

文件



登记 在控制台中显示
常量学生=[]; var name=document.getElementById(“name”).value; var mail=document.getElementById(“邮件”).value; var pass=document.getElementById(“pass”).value; 变量寄存器=函数(){ 让User=JSON.parse(`{“NAME”:“`+NAME+`”,“EMAIL\u ID”:“`+mail+`”,“PASSWORD”:“`+pass+`}”); console.log(用户); 学生推送(用户); } 函数Show(){ setTimeout(函数(){ 设n=student.length; var text=“”; for(设i=0;i; } document.getElementById(“视图”).innerHTML=text; }, 2000); }
当然可以,作为最佳实践,您可以使用let关键字而不是var。
我猜您是错误地解析了json。

问题是您在页面加载时获取了输入值,而不是在单击Register按钮时

因此,将这些行移到
寄存器
函数中

我必须提到,在自建字符串上使用
JSON.parse
是一种反模式。您应该使用普通的旧对象文字

不太重要,但通常的做法是对变量使用camelCase,并为构造函数/类保留PascalCase。因此,将
User
重命名为
User
。属性也是如此,但我保留了它们,因为它会影响其他代码:

  var Register = function() {
      var name= document.getElementById("name").value;
      var mail= document.getElementById("mail").value;
      var pass= document.getElementById("pass").value;
      let user= { "NAME": name, "EMAIL_ID": mail, "PASSWORD": pass };
      console.log(user);
      student.push(user);
  }

是的,你绝对可以

您出错的地方在于过早地分配了输入值

我们来看看

var name= document.getElementById("name").value;
var mail= document.getElementById("mail").value;
var pass= document.getElementById("pass").value;
当浏览器解析代码时,它会立即将输入值分配给变量,此时它包含空值

此时您只希望像这样引用输入元素

var userName= document.getElementById("name"); // note we change the variable from name to userName hence we cannot uses "name" as a variable 
var mail= document.getElementById("mail");
var pass= document.getElementById("pass");
并获取register()函数中元素的值

尝试查看整个代码:

const students = [];
    let userName = document.getElementById('name')
    let mail = document.getElementById('mail')
    let pass = document.getElementById('pass')


    function register() {
      let user = { name: userName.value, email_id: mail.value, pass: pass.value };
      console.log(user);
      students.push(user);
    }

    function show() {
      setTimeout(function () {
        let text = '';
        for (const student of students) {
          text = `Name=${student.name}, Email=${student.email_id}, Password=${student.pass} <br>`
        }
        document.getElementById("view").innerHTML = text;
      }, 2000);
    }
const students=[];
让userName=document.getElementById('name')
让mail=document.getElementById('mail'))
let pass=document.getElementById('pass')
函数寄存器(){
let user={name:userName.value,email\u id:mail.value,pass:pass.value};
console.log(用户);
学生。推送(用户);
}
函数show(){
setTimeout(函数(){
让text='';
for(学生中的const学生){
text=`Name=${student.Name},Email=${student.Email_id},Password=${student.pass}
` } document.getElementById(“视图”).innerHTML=text; }, 2000); }
不相关,但那
JSON.parse
伤害了我的眼睛!不要那样做。使用对象文字。您的代码缩进可以改进…请提供一个关于您的问题的答案:您从未调用
Register
,因此
students
仍然是一个空数组。@trincot它是单独的js文件。实际上,我通过中的一个按钮调用了该函数HTML@SaptarshiDey,请编辑您的问题,使您的问题重现。这意味着您应该添加处理按钮单击的代码。当我声明并初始化函数本身中的变量时,代码运行得非常好