[英]JavaScript: alert object name as a string
我试图在一个函数中将任何JavaScript对象作为字符串alert
。 这意味着如果给函数的参数是window.document
,即实际对象,它应该将“window.document”(不带引号)作为文字字符串提醒。
以下电话......
example(window);
example(window.document);
example(document.getElementById('something'));
......叫这个功能......
功能示例(o){/ *请稍微帮忙吗? * /}
...应该输出以下字符串......
window
window.document
document.getElementById('something')
我试图用toString()
和eval()
组合在黑暗中进行一些更多的混合镜头而没有成功。
不需要疯狂的向后兼容性,新的ECMAScript / JavaScript功能/功能都可以。 尽管目标应该非常直接,但请随意查询澄清。
这在自包含脚本中是不可能的。
如果使用预处理器是一个选项,那么您可以编写一个将example(whatever)
转换为example('whatever')
。 除此之外,我担心你运气不好。
第一个问题是对象没有名称。
第二个问题是,从您的示例中,您不是真的想要打印对象的(不存在的)名称,而是希望将计算的表达式打印到对象的引用中。 这就是你在这个例子中要做的事情:
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')
( test()
函数中对a
和b
的赋值只是为了验证正则表达式没有占用太多代码。)
但是,如果调用函数中有多个对example()
的调用,或者如果该调用分成多行,则会失败。 另外, arguments.callee.caller
已被弃用了一段时间,但只要您没有处于严格模式,大多数浏览器仍然支持arguments.callee.caller
。 我想这个hack可能对某些调试目的很有用。
不知道为什么需要这个,但是你可以尝试递归地遍历对象树并将它的节点与你的参数进行比较:
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
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.