在 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()
替换为您想要的内容,调用另一个函数,调试调用...
我是 运行 一些使用 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()
替换为您想要的内容,调用另一个函数,调试调用...