查找新Function()失败时发生语法错误的位置

时间:2013-09-04 21:51:29

标签: javascript browser

要快速查看“不使用新功能”和/或“eval is evil”的长注释部分,此问题是关于如何尽可能访问与new Function()相关的错误信息构造函数失败。在规范和标准浏览器实现允许的范围内尝试利用JavaScript时,发现浏览器允许我做的限制主要是一个问题。所以有了免责声明:

通过新的Function()调用来评估代码时,是否有办法找出函数内容中出现语法错误的位置,是否正在评估非法语法代码?即:

try {
  var generator = new Function(input);
  try {
    generator();
  }
  catch (runtimeError) {
    console.error("legal code; unforeseen result: ", runtimeError);
  }
}
catch (syntaxError) {
  console.error("illegal code; syntax errors: ", syntaxError);
}

当生成器的构建失败时,有没有办法找出(从浏览器,不使用jslint或其他外部库)错误是什么或它发生在哪里?

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/SyntaxError/prototype提到SyntaxError有filenamelinenumber属性,但是对于通过新的Function()构造函数评估的动态代码,这些属性是未定义的,所以依赖关于错误对象本身似乎不是一个选项。有没有其他方法可以将代码引入浏览器,以便代码一旦我们知道它有来自失败的新函数调用的语法错误,就可以根据所使用的JS引擎找出问题所在?

(当然,如果目标是简单地找到语法错​​误,那么jslint作为预处理步骤将成为首选解决方案,但我对浏览器是否能以某种方式报告此问题更感兴趣信息,即使是有限的形式,如“在线/ char上有一些错误......”)

2 个答案:

答案 0 :(得分:4)

afaik无法找出它发生的地方。但您可能希望查看Exception.message以获取错误信息。

示例:http://jsbin.com/IRoDiJIV/1/watch?js

答案 1 :(得分:1)

使用simiar方法自行找到解决方案setting breakpoints in evaled code

在chrome dev工具的sources面板中,我将以下内容放在new Function行的条件断点中(因为它是库代码而我无法更改它。)

(function(eval_js, load_js) {
  try {
    eval(eval_js);
  } catch (e) {
    (function addCode(js) {
      var e = document.createElement('script');
      e.type = 'text/javascript';
      e.src = 'data:text/javascript;charset=utf-8,' + escape(js);
      document.body.appendChild(e);
      console.warn("Inserted Script for ", js);
    })(load_js.replace(/;/g,";\n"));
    handlerCode = "";
    return false;
  }
  return false;
})("new Function('event', handlerCode)", handlerCode)