JavaScript-自调用函数可以';无法从外部脚本查看函数

JavaScript-自调用函数可以';无法从外部脚本查看函数,javascript,html,scope,global-variables,self-invoking-function,Javascript,Html,Scope,Global Variables,Self Invoking Function,我对以下代码的作用域有一个概念上的问题 该代码是用于两个表单的简单客户端验证脚本 我使用了一个自调用函数来尝试一种不同的方法,避免设置所有全局变量,但它的行为在我看来有点奇怪 我仍在学习使用JavaScript编写代码,我不是专家,但这些高级功能有点复杂 我不想使用jQuery,只想使用纯JavaScript来学习基础 <!-- Forms handling --> <script src="validate_functions.js"></script>

我对以下代码的作用域有一个概念上的问题

该代码是用于两个表单的简单客户端验证脚本

我使用了一个自调用函数来尝试一种不同的方法,避免设置所有全局变量,但它的行为在我看来有点奇怪

我仍在学习使用JavaScript编写代码,我不是专家,但这些高级功能有点复杂

我不想使用jQuery,只想使用纯JavaScript来学习基础

<!-- Forms handling -->

<script src="validate_functions.js"></script>

<script>

(function main() {

  var frmPrev = document.getElementById('frmPrev');
  var frmCont = document.getElementById('frmCont');

  var btnPrev = frmPrev['btnPrev'];
  var btnCont = frmCont['btnCont'];

  var caller = '';

  var forename = '';
  var surname = '';
  var phone = '';
  var email = '';
  var privacy = '';
  var message = '';

  var infoBox = document.getElementById('info-box');
  var infoBoxClose = infoBox.getElementsByTagName('div')['btnClose'];

  btnPrev.onclick = function(e) {

    submit(e);

  };

  btnCont.onclick = function(e) {

    submit(e);

  };

  function submit(which) {

    caller = which.target.name;

    var errors = '';

    if(caller == 'btnPrev') {

      forename = frmPrev['name'].value.trim();
      surname = frmPrev['surname'].value.trim();
      phone = frmPrev['phone'].value.trim();
      email = frmPrev['email'].value.trim();
      message = frmPrev['message'].value.trim();
      privacy = frmPrev['privacy'].checked;

    }

    if(caller == 'btnCont') {

      phone = frmCont['phone'].value.trim();
      email = frmCont['email'].value.trim();
      message = frmCont['message'].value.trim();

    }

    errors = validateFields(caller, forename, surname, phone, email, privacy, message);

    if(errors == '') {

      var params = 'which=' + caller;
      params += '&fname=' + forename;
      params += '&sname=' + surname;
      params += '&tel=' + phone;
      params += '&email=' + email;
      params += '&priv=' + privacy;
      params += '&mess=' + message;

      var request = asyncRequest();

      request.open('POST', "send-mail.php", true);
      request.setRequestHeader('Content-type', 'application/x-www-form-urlencoded');
      request.setRequestHeader('Content-length', params.length);
      request.setRequestHeader('Connection', 'close');

      request.onreadystatechange = function() {

        if(this.readyState == 4) {

          if(this.status == 200) {

            if(this.responseText != null) {

              infoBox.innerHTML = this.responseText;

            } else {

              infoBox.innerHTML = '<p>No data from server!</p>';

            }

          } else {

            infoBox.innerHTML = '<p>Could not connect to server! (error: ' + this.statusText + ' )</p>';

          }

        }

      }

      request.send(params);

    } else {

      infoBox.innerHTML = errors;

    }

    infoBox.style.display = 'block';

  }

  infoBoxClose.onclick = function() {

    infoBox.style.display = 'none';
    infoBox.innerHTML = '';

  };

  function validateFields(_caller, _forename, _surname, _phone, _email, _privacy, _message) {

    var errs = '';

    if(_caller == 'btnPrev') {

      errs += validateForename(_forename);
      errs += validateSurname(_surname);
      errs += validatePhone(_phone);
      errs += validateEmail(_email);
      errs += validateMessage(_message);
      errs += validatePrivacy(_privacy);

    }

    if(_caller == "btnCont") {

      errs += validatePhone(_phone);
      errs += validateEmail(_email);
      errs += validateMessage(_message);

    }

    return errs;

  }

  function asyncRequest() {

    var request;

    try {

      request = new XMLHttpRequest();

    }

    catch(e1) {

      try {

        request = new ActiveXObject('Msxml2.XMLHTTP');

      }

      catch(e2) {

        try {

          request = new ActiveXObject('Microsoft.XMLHTTP');

        }

        catch(e3) {

          request = null;

        }

      }

    }

    return request;

  }

})();

(函数main(){
var frmPrev=document.getElementById('frmPrev');
var frmCont=document.getElementById('frmCont');
var btnPrev=frmPrev['btnPrev'];
var btnCont=frmCont['btnCont'];
var调用者=“”;
变量名=“”;
var姓氏=“”;
var phone='';
var电子邮件=“”;
var隐私=“”;
var消息=“”;
var infoBox=document.getElementById('info-box');
var infoBoxClose=infoBox.getElementsByTagName('div')['btnClose'];
btnPrev.onclick=函数(e){
提交(e);
};
btnCont.onclick=函数(e){
提交(e);
};
功能提交(哪个){
调用者=which.target.name;
var误差=“”;
如果(呼叫者=='btnPrev'){
forename=frmPrev['name'].value.trim();
姓氏=frmPrev['姓氏].value.trim();
phone=frmPrev['phone'].value.trim();
email=frmPrev['email'].value.trim();
message=frmPrev['message'].value.trim();
隐私=frmPrev[“隐私”]。已选中;
}
如果(调用者=='btnCont'){
phone=frmCont['phone'].value.trim();
email=frmCont['email'].value.trim();
message=frmCont['message'].value.trim();
}
错误=验证字段(呼叫者、姓名、姓氏、电话、电子邮件、隐私、消息);
如果(错误=“”){
var params='which='+调用者;
params+='&fname='+forename;
params+='&sname='+姓氏;
params+='&tel='+电话;
参数+='&电子邮件='+电子邮件;
params+='&priv='+隐私;
参数+='&mess='+消息;
var request=asyncRequest();
open('POST','sendmail.php',true);
setRequestHeader('Content-type','application/x-www-form-urlencoded');
request.setRequestHeader('Content-length',params.length);
setRequestHeader('Connection','close');
request.onreadystatechange=函数(){
if(this.readyState==4){
如果(this.status==200){
如果(this.responseText!=null){
infoBox.innerHTML=this.responseText;
}否则{
infoBox.innerHTML='没有来自服务器的数据!

'; } }否则{ infoBox.innerHTML='无法连接到服务器!(错误:'+this.statusText+')

; } } } 请求发送(params); }否则{ infoBox.innerHTML=错误; } infoBox.style.display='block'; } infoBoxClose.onclick=function(){ infoBox.style.display='none'; infoBox.innerHTML=''; }; 函数验证字段(\u呼叫者、\u名字、\u姓氏、\u电话、\u电子邮件、\u隐私、\u消息){ var errs=''; 如果(_caller=='btnPrev'){ errs+=validateForename(_forename); errs+=validateSurname(_姓氏); errs+=验证电话(_电话); errs+=validateEmail(_email); errs+=验证消息(_消息); errs+=验证隐私(_隐私); } 如果(_caller==“btnCont”){ errs+=验证电话(_电话); errs+=validateEmail(_email); errs+=验证消息(_消息); } 返回错误; } 函数asyncRequest(){ var请求; 试一试{ 请求=新的XMLHttpRequest(); } 渔获物(e1){ 试一试{ 请求=新的ActiveXObject('Msxml2.XMLHTTP'); } 渔获物(e2){ 试一试{ 请求=新的ActiveXObject('Microsoft.XMLHTTP'); } 渔获物(e3){ 请求=null; } } } 返回请求; } })();
Web控制台一直告诉我没有定义单一验证函数

为什么?

它们应该从外部脚本加载。。此外,它们应该具有全球范围

提前感谢:)

问题解决了

外部脚本的路径不正确


对不起,这些垃圾^^“

删除函数main(){`(和结尾的右括号)前面的
)@dustytrash为什么?会有什么变化?你确定问题不包含在
validate_functions.js
中吗?如果validate_functions.js文件中有IIFEs,那么这些函数不是全局函数。命名函数表达式的名称仅在函数本身中可见。解决后,我确定外部文件的路径是c正确,但事实并非如此;由于路径不正确,脚本未加载“validate_functions.js”。谢谢大家:)