简介:
我正在尝试获取函数定义的行号,以便仅对公共内容解析文档注释。我已经到了可以找到函数名称的地步,如果我想要我可以执行该函数,但我似乎无法找出任何方法来提取行号信息。注意:这纯粹是出于文档目的,因此不需要跨浏览器。
我知道firebug(但不是firebug lite,所以我不知道这是多么可能)显示鼠标悬停时引用函数的行号和脚本位置。我查看了萤火虫的来源并找到了他们的电话(domPanel.js:536
),但似乎无法在其来源的任何地方找到这个“addMember”功能:
this.addMember(object, "userFunction", userFuncs, name, val, level, 0, context);
可能这是不可能确定的。我的后备使用[userfunction].name
和[userfunction].toSource()
,然后尝试匹配源与源。但是我想尽可能避免这些,因为名称可能是非唯一的,而toSource()给出了源后处理。也许有办法绑定firebug api?
最小说明代码:
[注意目标是获取此信息:window.MyWindowObject.PublicFunction: script.js line 3
]
的script.js
(function () {
function referencedFunction() {
///<summary>Sample XML Doc Comment</summary>
alert('well hello there!');
}
var publicObject = window.MyWindowObject || {};
publicObject.PublicFunction = referencedFunction;
window.MyWindowObject = publicObject;
}());
的index.htm
<!DOCTYPE html>
<html>
<script src="script.js"></script>
</html>
编辑:对于之后在搜索中发现此内容的任何人,我发现了一些其他有用的相关信息:
Stacktrace.js:https://github.com/eriwen/javascript-stacktrace - 非常接近,但不是我想要的,因为它似乎没有获得最终功能的位置。他们网站上的例子不正确(尽管演示“看起来”像我想要的那样)
在chrome(和IE9)中:[userfunction].toString()
保留注释(不在firefox中),这是我最终可能会使用的。我打算使用firefox的[userfunction]
。toSource(),但这看起来像浏览器操作的函数源。 firefox的[userfunction]
。toString()似乎保留了代码,但删除了注释
答案 0 :(得分:2)
这是我尚未测试过的潜在解决方案。几年前,有一个security exploit允许JavaScript重新声明本机对象的构造函数。 John Walker举了这个例子:
function Array() {
this[1] = 50;
}
var a = [40];
alert(a[0] + a[1]); // Gives 90
同样,也许可以在存在漏洞的浏览器中重新声明函数声明?
function Function() {
// Should give the stack trace, complete with line number?
alert(new Error().stack);
}
window.x = function () {}
我没有必要的浏览器(John Resig引用Firefox 2,Opera 9和Safari 3作为Array漏洞利用的浏览器),所以我无法测试它,但也许这是一个开始的地方?
答案 1 :(得分:0)
Firebug可以访问普通JS没有的受保护的Chrome功能。
但是,只要同源策略不阻止访问,JS仍然可以访问原始<script>
源,注释完好无损。
例如,此代码将获取所有嵌入脚本的原始源以及从同一域加载的所有脚本。 :
var scipts = document.querySelectorAll ('script');
for (var J = 0, L = scipts.length; J < L; ++J) {
console.log ('Number: ', J);
var node = scipts[J];
if (!node) continue;
if (node.src) {
//$.get (node.src, function (data) {console.log ('Text: ', data); } );
try {
var req = new XMLHttpRequest();
req.open ('GET', node.src, false);
req.send (null);
if (req.status == 200 || req.status == 304)
console.log ('Text: ', req.responseText);
}
catch (err) {
console.log (err);
}
}
else if (node.innerHTML) {
console.log ('Text: ', node.innerHTML);
}
}
然后可以解析原始脚本的行号和函数定义等。