我可以在Javascript的局部函数中访问全局变量吗?
我正在尝试访问变量name、email、pass,但每次尝试访问时,User.name、User.email\u ID和User.PASSWORD的值都为空。难道我不能全局使用这3个变量吗我可以在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
<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,请编辑您的问题,使您的问题重现。这意味着您应该添加处理按钮单击的代码。当我声明并初始化函数本身中的变量时,代码运行得非常好