2015-11-12 77 views
2

我看到的代碼片段是這樣的:如何解釋(文件)0]

with(document)0[(getElementsByTagName('head')[0] || body).appendChild(createElement(xxx))] 

我不知道該怎麼理解with(document)0[]

+0

'(文檔)0'在控制檯中給出錯誤:/ –

+0

這應該是一個解析錯誤。你在哪裏遇到過這個? – deceze

+2

我並不感到驚訝,你不明白它 - 這是無稽之談。 – joews

回答

0

這不是有效的JavaScript語法,並試圖仔細閱讀,語義是非常不清楚的。

我想象筆者的意思是這樣的:「如果有文檔中的任何<head>標籤,返回第一個返回,否則追加createElement(xxx)到身體的結果」

document.getElementsByTagName('head')[0] || document.body.appendChild(createElement(xxx)) 

0

如果沒有完整的代碼,很難回答這個問題。但我會在這裏做一些假設。

我想說的第一件事是避免使用with()聲明。在ECMAScript 5中不推薦使用,在strict mode中禁止使用。其中一個原因是你的片段 - 這段代碼讓很多人困惑,甚至你。

讓我們重寫它一點點,使其更容易理解:

with(document) { 
    0[(getElementsByTagName('head')[0] || body).appendChild(createElement(xxx))]; 
} 

如何with運作的,你可以在這裏閱讀 - with statement,但基本上是給我們直接使用所有的屬性和方法的能力的表達,我們發送到with(在我們的情況下這是一個document)。

那麼,這段代碼如何看起來像沒有with

0[(document.getElementsByTagName('head')[0] || document.body).appendChild(document.createElement(xxx))]; 

我沒有的唯一答案是 - 爲什麼要在括號內執行此代碼?假設我有以下幾條:

這段代碼片段(document.getElementsByTagName('head')[0] || document.body).appendChild(document.createElement(xxx))將返回新創建元素的節點。但是,如果我們將此代碼放入0[],它將返回undefined,因爲沒有此類屬性。再說一遍,很難理解這段代碼片段的所有部分,而沒有全部的圖片。

+0

「(文檔)0 [(getElementsByTagName('head')[0] || body).appendChild(createElement('script')).src ='http://bdimg.share.baidu.com/static/ api/js/share.js?cdnversion ='+〜(-new Date()/ 36e5)];「這是源代碼,它運行良好;我知道可以更改範圍;但0如何解釋 – Perhaps

+0

是的,這段代碼應該工作正常,它的寫入是正確的。 我不知道任何'後臺魔術'在js中可以用'0 []'在這段代碼片段中做些什麼。對我來說唯一合乎邏輯的解釋是這個片段的返回值。所以,在內部表達式被執行後,它會返回src,所以代碼如下所示:'with(document)0 [「http:// ...」];'。爲了處理這個問題,JS引擎會執行'new Number(0)'並在這個新創建的對象中搜索「http:// ...」屬性並返回'undefined'。 因此,由於使用了'0'封裝,這段代碼將返回'undefined'而不是'http:// ...' –

+0

謝謝你的回答;但我認爲這沒有意義,因爲沒有變量來保存返回值 – Perhaps