跟踪eval中的当前行号

时间:2015-11-25 07:38:40

标签: javascript angularjs eval line-numbers

我正在使用eval运行一些代码,这将改变名为$scope的{​​{1}}对象。

这是我的观察者:

variables

这是我正在运行的代码(这只是示例代码;它可能是我无法预料的任意代码):

$scope.$watch(function () {
  return $scope.variables;
}, function (variables) {
  console.log('changed!');
}, true);

在此示例中,观察者被触发两次,并为我提供了新值。到现在为止还挺好。缺少的是第一次触发是由eval调用中的第一行引起的信息,第二行是第二行引起的信息(注意eval调用中的eval('$scope.variables.foo = "bar";\n$scope.variables.bar = "foo";'); 表示新的行号)

有没有办法使用Angular或纯JavaScript实现这一目标?我已经研究了像https://github.com/stacktracejs/stacktrace.js这样的工具,但他们似乎没有做到这一点。

为了清楚起见,我在查找错误时查找行号。当触发观察者的回调时,我需要跟踪eval语句当前所在的行,以便我可以将该行号与我正在观看的对象所做的更改相关联。

1 个答案:

答案 0 :(得分:1)

您可以将输入字符串拆分为\n并插入新的语句来跟踪行号

var s = '$scope.variables.foo = "bar";\n$scope.variables.bar = "foo";\n'
var arr = s.split(/\n/);
var out = [];
for (var i = 0; i < arr.length; i++) {
  out.push("console.log('current line: " + i + "');");
  out.push(arr[i]);
}
out = out.join('\n');
console.log(out);
document.write('<pre>' + out + '</pre>');

您可以根据需要替换console.log(),调用另一个函数,调试调用......