首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >确定函数引用的源行和文件- Firebug是如何做到的?

确定函数引用的源行和文件- Firebug是如何做到的?
EN

Stack Overflow用户
提问于 2011-07-31 03:57:32
回答 2查看 1.5K关注 0票数 6

简介:

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

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

代码语言:javascript
复制
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

代码语言:javascript
复制
(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

代码语言:javascript
复制
<!DOCTYPE html>
<html>
  <script src="script.js"></script>
</html>

编辑:对于后来在搜索中找到这篇文章的任何人,这里是我找到的其他一些有用的相关信息:

Stacktrace.js:https://github.com/eriwen/javascript-stacktrace -非常接近,但不是我想要的,因为它似乎没有得到最终函数的位置。他们网站上的示例不正确(尽管演示“看起来”像我想要的)

在chrome (和IE9)中:[userfunction].toString()保留注释(不在火狐中),这可能是我最终要用到的。我打算使用火狐的[userfunction].toSource(),但这看起来像是浏览器操纵的函数源代码。火狐的[userfunction].toString()似乎保留了代码,但去掉了注释

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-08-01 09:04:13

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

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

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

代码语言:javascript
复制
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);
    }
}

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

票数 0
EN

Stack Overflow用户

发布于 2011-07-31 07:38:38

这是一个我还没有测试过的潜在解决方案。几年前,有一个security exploit允许JavaScript重新声明本机对象的构造函数。John Walker给出了这个例子:

代码语言:javascript
复制
function Array() {
    this[1] = 50;
}
var a = [40];
alert(a[0] + a[1]); // Gives 90

同样,也许可以在存在漏洞的浏览器中重新声明函数声明?

代码语言:javascript
复制
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漏洞的浏览器),所以我不能测试它,但也许这是一个开始?

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6885659

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档