我正在尝试构建基本的密码应用程序。用户“创建”密码并点击保存。屏幕将切换到另一个输入框,提示用户重新输入密码以进行登录。为此,我创建了两个函数,第一个函数是save()函数,该函数将创建的密码的值存储在名为“ savePass”的变量中。第二个函数enter()包含一个条件语句,该条件语句将“ savePass”的值与变量“ enterPass”进行比较(此第二个变量存储“输入密码”输入的值)。如果两个变量值匹配,则模式叠加层消失,并且用户实质上已登录。如果值不匹配,则叠加层保持在原位。
我最初设置JavaScript是为了使save()函数将输入值分配给“ savePass”变量,我在第一个函数之外声明了该变量,以便对save()和enter()都可见功能。但是,我注意到,当我删除该全局声明(“ var savePass”)时,entry()函数似乎仍然可以访问save()函数内部未声明的“ savePass”变量。换句话说,即使没有全局变量,整个代码似乎仍然可以正确执行。
我的问题:为什么未声明的“ savePass”变量在第二个enter()函数中可见,即使其范围仅限于save()函数呢?您如何建议在此应用中重新配置变量?
newStyles = {
...styles,
width: '30%',
height: '30%',
}
JS:
var modal = document.getElementById("myModal");
//var savePass;
function save() {
savePass = document.getElementById("savePass").value;
document.getElementById("displayInput1").style.display = "none";
document.getElementById("displayInput2").style.display = "block";
}
function enter() {
var enterPass = document.getElementById("enterPass").value;
if (enterPass === savePass) {
modal.style.display = "none";
} else {
modal.style.display = "block";
}
}
HTML:
<center>
<h1>You successfully logged in!!!!!!!!!!!!</h1>
</center>
<div id="myModal" class="modal">
<div class="modal-content">
<center>
<div id="displayInput1">
<h3>Create Password</h3>
<input id="savePass" class="input-lg" placeholder="create password" />
<button class="btn-primary btn-lg" onclick="save()">Save</button>
</div>
<div id="displayInput2" style="display: none">
<h3>Enter Password</h3>
<input id="enterPass" class="input-lg" placeholder="enter password" />
<button class="btn-primary btn-lg" onclick="enter()">enter</button>
</div>
</center>
</div>
</div>
答案 0 :(得分:0)
如this answer所示,如您在此处所做的那样,在不使用var
关键字的情况下声明变量实际上使它们成为全局变量。所以您的代码实际上是这样的:
var savePass;
function save() {
savePass = document.getElementById("savePass").value;
这实际上是JavaScript的strict mode
中的错误,被认为是不正确的做法。您实际上应该使用
var savePass;
在全局范围内,因此您的其他功能可以访问它们(根据需要)。
答案 1 :(得分:-1)
声明不带关键字var的变量会使该变量成为全局变量。