在 eval 中跟踪当前行号

Keep track of current line number in eval

我是 运行 一些使用 eval 的代码,它将更改一个名为 variables$scope 对象。

这是我的观察者:

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

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

eval('$scope.variables.foo = "bar";\n$scope.variables.bar = "foo";');

在这个例子中,watcher 被触发了两次,并给我新的值。到目前为止,一切都很好。缺少的信息是第一个触发器是由 eval 调用中的第一行引起的,第二个触发器由第二行引起(注意 eval 调用中的 \n 表示新的行号)。

有没有办法使用 Angular 或简单的 JavaScript 来实现此目的?我研究过 https://github.com/stacktracejs/stacktrace.js 之类的工具,但它们似乎无法解决问题。

澄清一下,我不是寻找抛出错误时的行号。当观察者的回调被触发时,我需要跟踪 eval 语句当前在哪一行,以便我可以将该行号与我正在观察的对象所做的更改相关联。

您可以将输入字符串拆分 \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() 替换为您想要的内容,调用另一个函数,调试调用...