2013-07-26 66 views
1

我試圖將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特性/功能都很好。儘管目標應該非常簡單,但請隨時查詢澄清情況。

回答

3

這是不可能在自包含的腳本中完成的。

如果使用預處理器將是一個選項,那麼你可以編寫一個將example(whatever)轉換爲example('whatever')。除此之外,我擔心你運氣不好。

1

第一個問題是對象沒有名稱。

的第二個問題是,從你的例子,你不是真的想要打印對象的(不存在)的名稱,你要打印的表達是評價,分爲一個對象的引用。這就是你想要什麼在這個例子中要做到:

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已被棄用一段時間,但只要您不處於嚴格模式,大多數瀏覽器仍支持該功能。不過,我認爲這種攻擊可能對某種調試有用。

0

不知道爲什麼你需要這個,但你可以嘗試遞歸遍歷對象樹,並與你的論點比較它的節點:

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 
相關問題