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

Ant*_*ile 5 javascript intellisense firebug

简单的介绍:

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

我知道firebug(但不是firebug lite,所以我不知道这是多么可能)显示鼠标悬停时引用函数的行号和脚本位置.我查看了firebug源代码并发现它们调用了(domPanel.js:536),但似乎无法在源代码中找到这个"addMember"函数:

this.addMember(object, "userFunction", userFuncs, name, val, level, 0, context);
Run Code Online (Sandbox Code Playgroud)

可能这是不可能确定的.我的后备正在使用[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;
}());
Run Code Online (Sandbox Code Playgroud)

index.htm的

<!DOCTYPE html>
<html>
  <script src="script.js"></script>
</html>
Run Code Online (Sandbox Code Playgroud)

编辑:对于在稍后搜索时发现此信息的任何人,我发现了一些其他有用的相关信息:

Stacktrace.js:https://github.com/eriwen/javascript-stacktrace - 非常接近但不完全是我想要的,因为它似乎没有获得最终功能的位置.他们网站上的例子不正确(虽然演示"看起来"像我想要的)

在chrome(和IE9)中:[userfunction].toString()保留注释(不在firefox中),这是我最终可能会使用的.我打算使用firefox的[userfunction].toSource(),但这看起来像浏览器操作的函数源.firefox的[userfunction].toString()似乎保留了代码,但删除了注释

Bro*_*ams 0

Firebug 可以访问普通 JS 无法访问的受保护的 Chrome 功能。

但是,<script>只要同源策略不阻止访问,JS 仍然可以访问原始源码,注释完好无损。

例如,此代码将获取所有嵌入脚本以及从同一域加载的任何脚本的原始源。:

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);
    }
}
Run Code Online (Sandbox Code Playgroud)

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