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()函数中的ab的分配仅仅是为了验证正则表达式不会拾取太多的代码。)

但是,如果在调用函数中存在多个致电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

回到顶部