全局变量可以在函数内部执行吗?

时间:2019-01-19 20:32:09

标签: javascript html css

我正在尝试构建基本的密码应用程序。用户“创建”密码并点击保存。屏幕将切换到另一个输入框,提示用户重新输入密码以进行登录。为此,我创建了两个函数,第一个函数是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>

2 个答案:

答案 0 :(得分:0)

this answer所示,如您在此处所做的那样,在不使用var关键字的情况下声明变量实际上使它们成为全局变量。所以您的代码实际上是这样的:

var savePass;

function save() {
    savePass = document.getElementById("savePass").value;

这实际上是JavaScript的strict mode中的错误,被认为是不正确的做法。您实际上应该使用

var savePass;

在全局范围内,因此您的其他功能可以访问它们(根据需要)。

答案 1 :(得分:-1)

声明不带关键字var的变量会使该变量成为全局变量。