如何在JavaScript中获取调用该函数的行?

时间:2014-07-18 12:45:13

标签: javascript debugging tracing

下面的代码显示了我几乎完整的页面源(没有doctype)和调用test()的行号。因为代码不包含doctype,所以当我发出警报时(代码[line])我没有得到正确的答案。

<script>
function test(what)
{
    var err = new Error;
    var line = err.stack.split("\n")[1].split(':')[2];
    var code = document.documentElement.outerHTML.split("\n");
    console.log(code);
    alert(line);
}

test('hello there');
<script>

我如何进行测试(&#39; hello there&#39;);&#39;从我的测试函数作为字符串?

问题在于行号。我的行返回源文件中的正确行号,但我的代码返回具有不同编号的页面源(它错过了DOCTYPE并具有不同的换行符)。所以问题是:如何获得真实的&#34;页面来源?

2 个答案:

答案 0 :(得分:1)

解决方案是不在整个HTML文档中,而是在右script元素中。它有效,但在使用之前你需要一些注意事项:

<!DOCTYPE html>
<html>
<head>
  <meta charset="utf-8">
  <title>JS Bin</title>
</head>
<body>
<script>
  function test(what) {
    var err = new Error;
    console.log(err.stack.split("\n"))
    var line = err.stack.split("\n")[2].split(':')[1];
    var script = document.scripts[0];
    var code = (script.innerText||script.textContent).split(/<br>|\n/);
    console.log(line);
    console.log(code, code.length);
    console.log(code[+line]); // this logs "test('hello there');"
}

test('hello there');
</script>
</body>
</html>

要做的第一件事可能是给你的脚本元素一个id,而不是依赖于这个数字。

我真的不会将这样的事情分开进行一些简短的测试。

Demonstration (click "Run with JS")

答案 1 :(得分:0)

这是一个有效但难看的解决方案。丑陋因为:
1.再次加载同一页面 2.使用async ajax

<script>
function getSource()
{
    var request = new XMLHttpRequest();

    request.open('GET', location.href, false);
    request.send(null);

    if (request.status === 200) 
    {
        return request.responseText;
    }
    return '';
}
function test(what)
{
    var err = new Error;
    var line = err.stack.split("\n")[1].split(':')[2];
    var code = getSource().split("\n");
    alert(code[line-1]);
}

test('hello there');
</script>