【问题标题】:JavaScript: "Syntax error missing } after function body"JavaScript:“函数体后缺少语法错误}”
【发布时间】:2012-08-10 07:50:09
【问题描述】:

好的,你知道错误,但我到底为什么会得到它?

在本地运行时我完全没有错误,但是当我上传我的项目时,我遇到了这个烦人的语法错误。我检查了Firebug 错误控制台,它没有帮助,因为它把我的所有源代码放在同一行,我通过 Lint 解析它似乎也没有找到问题 - 我刚刚结束以我讨厌的方式以不同的方式格式化我的牙套;与语句在同一行,bleugh。

function ToServer(cmd, data) {
    var xmlObj = new XMLHttpRequest();
    xmlObj.open('POST', 'handler.php', true);
    xmlObj.setRequestHeader('Content-type', 'application/x-www-form-urlencoded');
    xmlObj.send(cmd + data);
    xmlObj.onreadystatechange = function() {
        if(xmlObj.readyState === 4 && xmlObj.status === 200) {
            if(cmd == 'cmd=push') {
                document.getElementById('pushResponse').innerHTML = xmlObj.responseText;
            }
            if(cmd == 'cmd=pop') {
                document.getElementById('messages').innerHTML += xmlObj.responseText;
            }
            if(cmd == 'cmd=login') {
                if(xmlObj.responseText == 'OK') {
                    self.location = 'index.php';
                }
                else {
                    document.getElementById('response').innerHTML = xmlObj.responseText;
                }
            }
        }
    }
}

function Login() {
    // Grab username and password for login
    var uName = document.getElementById('uNameBox').value;
    var pWord = document.getElementById('pWordBox').value;
    ToServer('cmd=login', '&uName=' + uName + '&pWord=' + pWord);
}


// Start checking of messages every second
window.onload = function() {
    if(getUrlVars()['to'] != null) {
        setInterval(GetMessages(), 1000);
    }
}

function Chat() {
    // Get username from recipient box
    var user = document.getElementById('recipient').value;
    self.location = 'index.php?to=' + user;
}

function SendMessage() {
    // Grab message from text box
    var from = readCookie('privateChat');
    var to = getUrlVars()['to'];
    var msg = document.getElementById('msgBox').value;
    ToServer('cmd=push','&from=' + from + '&to=' + to + '&msg=' + msg);
    // Reset the input box
    document.getElementById('msgBox').value = "";
}

function GetMessages() {
    // Grab account hash from auth cookie
    var aHash = readCookie('privateChat');
    var to = getUrlVars()['to'];
    ToServer('cmd=pop','&account=' + aHash + '&to=' + to);
    var textArea = document.getElementById('messages');
    textArea.scrollTop = textArea.scrollHeight;
}

function readCookie(name) {
    var nameEQ = name + "=";
    var ca = document.cookie.split(';');
    for(var i=0;i < ca.length;i++) {
        var c = ca[i];
        while (c.charAt(0)==' ') c = c.substring(1,c.length);
        if (c.indexOf(nameEQ) == 0) return c.substring(nameEQ.length,c.length);
    }
    return null;
}

function getUrlVars() {
    var vars = {};
    var parts = window.location.href.replace(/[?&]+([^=&]+)=([^&]*)/gi, function(m,key,value) {
        vars[key] = value;
    });
    return vars;
}

【问题讨论】:

  • 什么时候出现错误?在页面加载或用户事件时。
  • 它在页面加载中。一旦页面加载,firefox web 开发者控制台就会给出一个模糊的语法错误消息。
  • @Lee 你能展示你的网站吗?
  • @xdazz 当然,www.fort-hub.com/privatechat/index.php

标签: javascript ajax syntax-error


【解决方案1】:

问题是您服务器上的脚本在一行中,并且其中包含 cmets。 // 之后的代码将被视为注释。就是这个原因。

function ToServer(cmd, data) { var xmlObj = new XMLHttpRequest(); xmlObj.open('POST', 'handler.php', true); xmlObj.setRequestHeader('Content-type', 'application/x-www-form-urlencoded'); xmlObj.send(cmd + data); xmlObj.onreadystatechange = function() { if(xmlObj.readyState === 4 && xmlObj.status === 200) {  if(cmd == 'cmd=push') {  document.getElementById('pushResponse').innerHTML = xmlObj.responseText;  }  if(cmd == 'cmd=pop') {  document.getElementById('messages').innerHTML += xmlObj.responseText;  }  if(cmd == 'cmd=login') {  if(xmlObj.responseText == 'OK') {   self.location = 'index.php';  }  else {   document.getElementById('response').innerHTML = xmlObj.responseText;  }  }   } };}function Login() { // Grab username and password for login var uName = document.getElementById('uNameBox').value; var pWord = document.getElementById('pWordBox').value; ToServer('cmd=login', '&uName=' + uName + '&pWord=' + pWord);}// Start checking of messages every secondwindow.onload = function() { if(getUrlVars()['to'] != null) { setInterval(GetMessages(), 1000); }}function Chat() { // Get username from recipient box var user = document.getElementById('recipient').value; self.location = 'index.php?to=' + user;}function SendMessage() { // Grab message from text box var from = readCookie('privateChat'); var to = getUrlVars()['to']; var msg = document.getElementById('msgBox').value; ToServer('cmd=push','&from=' + from + '&to=' + to + '&msg=' + msg); // Reset the input box document.getElementById('msgBox').value = "";}function GetMessages() { // Grab account hash from auth cookie var aHash = readCookie('privateChat'); var to = getUrlVars()['to']; ToServer('cmd=pop','&account=' + aHash + '&to=' + to); var textArea = document.getElementById('messages'); textArea.scrollTop = textArea.scrollHeight;}function readCookie(name) { var nameEQ = name + "="; var ca = document.cookie.split(';'); for(var i=0;i < ca.length;i++) { var c = ca[i]; while (c.charAt(0)==' ') c = c.substring(1,c.length); if (c.indexOf(nameEQ) == 0) return c.substring(nameEQ.length,c.length); } return null;}function getUrlVars() { var vars = {}; var parts = window.location.href.replace(/[?&]+([^=&]+)=([^&]*)/gi, function(m,key,value) { vars[key] = value; }); return vars;}

【讨论】:

  • 啊哈!但是为什么它在直播时放在一条线上?
  • 我认为你做对了。 @Lee r u 使用任何缩小工具来制作代码 1 衬里?
  • 不,什么都没有。那么我将不得不使用 /* */。
  • 可能有新的线路差异(Windows 与 Unix)?
  • 是的。我会建议你使用像jsmin这样的工具来缩小代码
【解决方案2】:

你少了一个分号:

function ToServer(cmd, data) {
    var xmlObj = new XMLHttpRequest();
    xmlObj.open('POST', 'handler.php', true);
    xmlObj.setRequestHeader('Content-type', 'application/x-www-form-urlencoded');
    xmlObj.send(cmd + data);
    xmlObj.onreadystatechange = function() {
        if(xmlObj.readyState === 4 && xmlObj.status === 200) {
            if(cmd == 'cmd=push') {
                document.getElementById('pushResponse').innerHTML = xmlObj.responseText;
            }
            if(cmd == 'cmd=pop') {
                document.getElementById('messages').innerHTML += xmlObj.responseText;
            }
            if(cmd == 'cmd=login') {
                if(xmlObj.responseText == 'OK') {
                    self.location = 'index.php';
                }
                else {
                    document.getElementById('response').innerHTML = xmlObj.responseText;
                }
            }           
        }
    }; //<-- Love the semi
}

额外缺少的分号:

// Start checking of messages every second
window.onload = function() {
    if (getUrlVars()['to'] != null) {
        setInterval(GetMessages(), 1000);
    }
}; //<-- Love this semi too!

【讨论】:

  • 为什么我在本地服务器上运行它时没有拾取它?顺便说一句,这仍然不能解决错误:/对不起,没有奖牌给你!
  • @xdazz 缺少 semi 会在某些浏览器中导致错误。 JSLint 也接受了它。
  • @zerkms 请推断。你是说你可以给一个变量赋值,并且不需要用分号结束语句?
  • @J Torres:只要下一个字符从外部函数关闭曲线括号 - 是的
【解决方案3】:

我认为您可以在此处调整 divide and conquer 方法。删除脚本的后半部分,看看是否出现错误。如果没有,请删除第一部分并查看。这是我遇到此类问题时遵循的一种技术。一旦你找到有错误的那一半,然后再细分那一半,直到你确定错误的位置。

这将帮助我们确定实际的错误点。

我认为这个脚本没有任何问题。

这可能不是您想要的确切解决方案,但它是一种定位和解决问题的方法。

【讨论】:

  • 我明白了。它一直是一种选择,只是想对剧本有新的看法,以确保我没有做愚蠢的事情。
  • 脚本没有问题,我再检查一下。
  • 你能分享你页面中实际的未格式化脚本(一个衬里)标签吗?
  • 太棒了 - 刚刚将分而治之应用于 5000 行脚本 - 10 分钟,我之前迷路了;这是非常合乎逻辑的,但有时专注于(调试)会使人盲目......
【解决方案4】:

看起来它被解释为全部在一条线上。在Fiddler 2 中查看相同的结果。

【讨论】:

  • 谢谢。我不确定为什么。我会改变我的cmets。
【解决方案5】:

这个问题可能是由于您的 JavaScript 代码中的 cmets 被缩小了。如果是这样并且您想保留您的 cmets,那么请尝试更改您的 cmets - 例如,从此:

// Reset the input box

...到...

/* Reset the input box */

【讨论】:

    【解决方案6】:

    添加注释:很奇怪,这个错误是随机出现的,一切正常。

    函数体后缺少语法错误} |在 index.html 的第 0 行

    看来,我在脚本的不同部分针对不同的 cmets 使用了 /**/ 和 //? 以及一些花哨的 Unicode 字符。

    为了清晰和解析,这对我很有用。

    但是,如果在执行任何 JavaScript 之前,在 cmets 中的 JavaScript 文件中使用了这个 Unicode 字符 以及可能的其他一些字符,则错误是随机产生的。

    这可能与 JavaScript 文件在被父页面调用和读取之前不是 UTF-8 的事实有关。当 DOM 准备好时,它是 UTF-8。我说不清楚。

    【讨论】:

      【解决方案7】:

      下面的代码中似乎也应该添加另一个分号:

      // Start checking of messages every second
      window.onload = function() {
          if(getUrlVars()['to'] != null) {
              setInterval(GetMessages(), 1000);
          }
      };  <---- Semicolon added
      

      同样在这段代码中,定义var函数的顶部

      function readCookie(name) {
          var i;
          var nameEQ = name + "=";
          var ca = document.cookie.split(';');
          for(i=0;i < ca.length;i++) {
              var c = ca[i];
              while (c.charAt(0)==' ') c = c.substring(1,c.length);
              if (c.indexOf(nameEQ) == 0) return c.substring(nameEQ.length,c.length);
          }
          return null;
      }
      

      【讨论】:

      • 这很有帮助,谢谢。任何想法为什么这在本地运行时不会导致问题?
      • 我不确定,但在我的 IDE 中,我启用了 Javascript 调试器,它显示这些是错误。我正在使用 Aptana Studio 3
      • 嗯我想我找到了一个线索...我正在使用记事本++,直到最近才使用我的 cpanel 文件管理器来上传我的文件。在我使用 FireZilla FTP 客户端之前一切都很好。我假设 FTP 客户端正在更改我的 JS 和 PHP 文件的格式或编码。
      【解决方案8】:

      “嗯,我想我找到了线索......我正在使用Notepad++,直到最近我还使用我的cPanel文件管理器来上传我的文件。在我使用FireZilla FTP客户端之前一切都很好。我'我假设 FTP 客户端正在更改我的 JS 和 PHP 文件的格式或编码。-"

      我相信这是您的问题(您可能已经解决了)。在遇到这个愚蠢的错误后,我只是尝试了一个不同的 FTP 客户端,它运行得完美无缺。我假设我使用的代码(由不同的开发人员编写)也没有正确关闭 cmets。

      【讨论】:

      • 这似乎与这个问题nothing有关。你能解释一下吗?
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-11-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-02-04
      相关资源
      最近更新 更多