17

为了缩短关于“不要使用新函数”和/或“eval 是邪恶的”的长评论部分,这个问题是关于如何访问(如果可能)与new Function()构造函数失败相关的错误信息。当尝试在规范和标准浏览器实现允许的范围内利用 JavaScript 时,发现浏览器允许我做什么的限制主要是一个问题。因此,有了免责声明:

通过 new Function() 调用评估代码时,如果正在评估非法语法代码,是否有办法找出函数内容中发生语法错误的位置?IE:

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 有一个filenameandlinenumber属性,但是对于通过 new Function() 评估的动态代码,这些是未定义的据我所知,构造函数,因此依赖错误对象本身似乎不是一种选择。是否有其他方法可以将代码引入浏览器,以便代码一旦我们知道它因新的函数调用失败而出现语法错误,就可以根据所使用的 JS 引擎找出问题出在哪里?

(当然,如果目标是简单地查找语法错误,jslint 作为预处理步骤将是首选解决方案,但我更感兴趣的是浏览器是否可以以某种方式报告此信息,甚至如果以有限的形式,例如“行/字符上存在一些错误......”)

4

2 回答 2

4

afaik 不可能找出它发生在哪里。但您可能希望查看 Exception.message 以获取错误信息。

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

于 2013-12-09T14:30:11.623 回答
1

自己找到了一个解决方案,使用类似的方法在评估代码中设置断点

在 chrome 开发工具的源面板中,我将以下内容放在该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)
于 2013-12-09T14:51:48.327 回答