我看到的代碼片段是這樣的:如何解釋(文件)0]
with(document)0[(getElementsByTagName('head')[0] || body).appendChild(createElement(xxx))]
我不知道該怎麼理解with(document)0[]
我看到的代碼片段是這樣的:如何解釋(文件)0]
with(document)0[(getElementsByTagName('head')[0] || body).appendChild(createElement(xxx))]
我不知道該怎麼理解with(document)0[]
這不是有效的JavaScript語法,並試圖仔細閱讀,語義是非常不清楚的。
我想象筆者的意思是這樣的:「如果有文檔中的任何<head>
標籤,返回第一個返回,否則追加createElement(xxx)
到身體的結果」
document.getElementsByTagName('head')[0] || document.body.appendChild(createElement(xxx))
。
如果沒有完整的代碼,很難回答這個問題。但我會在這裏做一些假設。
我想說的第一件事是避免使用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 [(getElementsByTagName('head')[0] || body).appendChild(createElement('script')).src ='http://bdimg.share.baidu.com/static/ api/js/share.js?cdnversion ='+〜(-new Date()/ 36e5)];「這是源代碼,它運行良好;我知道可以更改範圍;但0如何解釋 – Perhaps
是的,這段代碼應該工作正常,它的寫入是正確的。 我不知道任何'後臺魔術'在js中可以用'0 []'在這段代碼片段中做些什麼。對我來說唯一合乎邏輯的解釋是這個片段的返回值。所以,在內部表達式被執行後,它會返回src,所以代碼如下所示:'with(document)0 [「http:// ...」];'。爲了處理這個問題,JS引擎會執行'new Number(0)'並在這個新創建的對象中搜索「http:// ...」屬性並返回'undefined'。 因此,由於使用了'0'封裝,這段代碼將返回'undefined'而不是'http:// ...' –
謝謝你的回答;但我認爲這沒有意義,因爲沒有變量來保存返回值 – Perhaps
'(文檔)0'在控制檯中給出錯誤:/ –
這應該是一個解析錯誤。你在哪裏遇到過這個? – deceze
我並不感到驚訝,你不明白它 - 這是無稽之談。 – joews