1

我试图alert在函数中将任何 JavaScript 对象作为字符串。这意味着如果给函数的参数是window.document实际对象,它应该将“window.document”(不带引号)作为文字字符串警告。

以下调用...

example(window);
example(window.document);
example(document.getElementById('something'));

...调用此函数...

function example(o) {/* 这里有一点帮助吗?*/}

...应该输出以下字符串...

window
window.document
document.getElementById('something')

我试图在黑暗中通过一些更杂的镜头的组合来做到这一点,但没有成功toString()eval()

不需要疯狂的向后兼容性,更新的 ECMAScript / JavaScript 特性/功能就可以了。尽管目标应该非常简单,但请随时询问澄清。

4

3 回答 3

3

这在自包含脚本中是不可能的。

如果使用预处理器是一种选择,那么您可以编写一个转换example(whatever)example('whatever'). 除此之外,恐怕你运气不好。

于 2013-07-26T07:57:35.060 回答
1

第一个问题是对象没有名称。

第二个问题是,从您的示例中,您并不是真的想要打印对象的(不存在的)名称,而是想要打印评估为对象引用的表达式。这就是您在此示例中尝试执行的操作:

example(document.getElementById('something'));

为了打印document.getElementById('something'),JavaScript 必须将该表达式的实际文本保存在它可以提供给您的某个地方。但它不会那样做。它仅评估已解析和编译的表达式,而不参考表达式的原始文本。

如果您愿意将论点引用到example(),那么这当然是微不足道的:

example( "document.getElementById('something')" );

显然,在这种情况下,您可以直接打印字符串,eval()也可以获取表达式的结果。

OTOH,如果您想尝试真正的破解,可以在一些非常有限的情况下使用以下技巧:

function example( value ) {
    var code = arguments.callee.caller.toString();
    var match = code.match( /example\s*\(\s*(.*)\s*\)/ );
    console.log( match && match[1] );
}

function test() {
    var a = (1);
    example( document.getElementById('body') );
    var b = (2);
}

test();

这将打印您想要的内容:

document.getElementById('body')

a(函数中b的赋值test()只是为了验证正则表达式没有占用太多代码。)

example()但是,如果调用函数中有多个调用,或者该调用被拆分为多行,这将失败。此外,arguments.callee.caller它已被弃用一段时间,但只要您不处于严格模式,大多数浏览器仍然支持。我想这个 hack 可能对某种调试目的有用。

于 2013-07-26T08:14:16.970 回答
0

不知道为什么需要这个,但您可以尝试递归遍历对象树并将其节点与您的参数进行比较:

function objectName(x) {

    function search(x, context, path) {
        if(x === context)
            return path;
        if(typeof context != "object" || seen.indexOf(context) >= 0)
            return;
        seen.push(context);
        for(var p in context) {
            var q = search(x, context[p], path + "." + p);
            if(q)
                return q;
        }
    }

    var seen = [];
    return search(x, window, "window");
}

例子:

console.log(objectName(document.body))

为我打印

window.document.activeElement
于 2013-07-26T09:05:05.997 回答