[英]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.