我在函数中尝试alert
任何JavaScript对象作为字符串。这意味着如果给函数的参数是window.document
,它是实际的对象,它应该将“window.document”(不带引号)警告为 literal 字符串。
以下电话......
example(window);
example(window.document);
example(document.getElementById('something'));
...调用此函数......
功能示例(o){/ *请稍微帮忙吗? * /}
...应输出以下字符串......
window
window.document
document.getElementById('something')
我试图用toString()
和eval()
的组合在黑暗中进行一些更多的混合镜头而没有成功。
不需要疯狂的向后兼容性,新的ECMAScript / JavaScript功能/功能都可以。尽管目标应该非常直接,但请随意查询澄清。
答案 0 :(得分:3)
在自包含脚本中无法做到这一点。
如果使用预处理器是一个选项,那么您可以编写一个将example(whatever)
转换为example('whatever')
的选项。除此之外,我担心你运气不好。
答案 1 :(得分: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
已被弃用了一段时间,但只要您没有处于严格模式,大多数浏览器仍然支持{{1}}。我想这个hack可能对某些调试目的很有用。
答案 2 :(得分: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