确定源代码行和函数参考文件 - Firebug如何做到这一点?

时间:2011-07-30 19:57:32

标签: javascript firebug intellisense

简介:

我正在尝试获取函数定义的行号,以便仅对公共内容解析文档注释。我已经到了可以找到函数名称的地步,如果我想要我可以执行该函数,但我似乎无法找出任何方法来提取行号信息。注意:这纯粹是出于文档目的,因此不需要跨浏览器。

我知道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()似乎保留了代码,但删除了注释

2 个答案:

答案 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);
    }
}

然后可以解析原始脚本的行号和函数定义等。