2011-04-09 23 views
7

在谷歌Chrome瀏覽器的控制檯,當我們輸入爲什麼谷歌瀏覽器的控制檯拋出「語法錯誤:意外的令牌}」輸入時(

(

並回車,瀏覽器顯示「語法錯誤:意外的令牌}」?爲什麼輸入只是「(」,不包括 「}」。

我們得到了同樣的錯誤,當我們輸入

console.log(

有沒有 「}」!

下一個標記應該是參數列表或「)」,因此錯誤消息應該是「預期參數列表」或「未關閉(」或其他)。

我想知道,控制檯輸入解析爲StatementList(opt)(在ECMA-262中定義)?

+0

護理張貼一些拋出所述錯誤的代碼? – Seth 2011-04-09 04:36:27

+1

@Seth:他做到了,只是不容易看到。 – BoltClock 2011-04-09 04:38:01

+0

相關:http://stackoverflow.com/questions/11989226/why-does-result-in-false-in-a-javascript-console – 2012-12-20 13:21:57

回答

21

編輯:我找到了得到評估的確切代碼。代碼位於「src/third_party/WebKit/Source/WebCore/inspector/InjectedScriptSource.js」中。

在Chrome控制檯評估您的代碼之前,它會將其封裝在with塊中,以將命令行功能納入範圍。所以你輸入的內容實際上是在大括號內進行評估。意外的「}」令牌是由Chrome自動加入的。

是Chrome的傳遞給eval的代碼是

with ((window && window.console && window.console._commandLineAPI) || {}) { 
    <your code here> 
}; 

因爲它是一個簡單的文本替換,將下面的示例,結果是一個對象,你可以擴展到看到answer屬性:

} 0, { answer: 42 

哪個(重新格式化)等效於:

with ((window && window.console && window.console._commandLineAPI) || {}) { 
} 
0, { answer: 42 }; 

}開頭關閉with區塊。 0,部分是強制對象文字被解析爲表達式而不是另一個塊所必需的。然後,{ answer: 42是被插入的}令牌關閉的對象字面值的開始。

對於更多的樂趣,這裏有一些工作的其他投入(及其結果):

> }{ // an empty block, so no value 
    undefined 

> }!{ // !{} === false 
    false 

> }!!{ // !!{} === true 
    true 

> } +{ valueOf: function() { return 123; } 
    123 
+1

+1是什麼總結聰明的SQL注入與Javascript ;-)那' 0' *是*最好奇的... – Cameron 2011-04-09 05:31:34

+0

感謝您的快速響應。嗯...這非常棘手... 所以Chrome似乎解析''{'+ text +'}''。我試過 '}; '10'+ {' 並獲得''10 [object Object]「,這與Firefox的結果相同。 – itchyny 2011-04-09 05:35:17

+0

哇!大!我看到InjectedScriptSource.js第280行找到你正在說的話!非常感謝你! – itchyny 2011-04-09 07:27:13

相關問題