JavaScript:将警告对象名称作为字符串
我试图将alert
中的任何JavaScript对象作为字符串在函数中使用。这意味着如果给函数的参数是window.document
,实际的对象,它应该提醒“window.document”(不包括引号)作为文字字符串。JavaScript:将警告对象名称作为字符串
以下呼叫...
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
已被弃用一段时间,但只要您不处于严格模式,大多数浏览器仍支持该功能。不过,我认为这种攻击可能对某种调试有用。
回答:
不知道为什么你需要这个,但你可以尝试递归遍历对象树,并与你的论点比较它的节点:
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
以上是 JavaScript:将警告对象名称作为字符串 的全部内容, 来源链接: utcz.com/qa/262556.html