我正在使用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语句当前所在的行,以便我可以将该行号与我正在观看的对象所做的更改相关联。
答案 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()
,调用另一个函数,调试调用......