JavaScript:将警告对象名称作为字符串

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