}!{
JavaScript コンソールを Chrome に配置すると、結果としてfalse
.
エラーが発生しないのはなぜですか?
この動作の理由は、Chrome がコンソールに入力したものを別のコードでラップするためです。
ラップするコード (執筆時点) は次のとおりです。
with ((window && window.console && window.console._commandLineAPI) || {}) {
// Your code here.
}
入力}!{
すると、コード ブロックのブレースが閉じられ、最後に新しい (否定された) オブジェクトが作成されます。
コンソールでわかるように、 が!{}
返されますfalse
。
私はこれに対する答えを見つけるためにかなり長い調査プロセスを経ました.私の元のコメントは以下に保存されています.
元の回答:
単なる理論です。コンソールに入力されたコードが関数内で呼び出されることを想像します
function execUserCode() { code }
あなたがしているのは創造です
function execUserCode() { }!{ }
コンソールは最後の結果を返しています。これは実際には!{ }
=false
編集:
これがおそらく間違っている方法についてのコメントがたくさんあります。同意します。それは単なる理論です。
私はこの種のパズルが好きなので、Chromium のソースを調べてみました。私には少し大変ですが、他の誰かが刺した場合に備えて、いくつかの指針を残しておきます。
JS コンソールは「インスペクター」と呼ばれ、次の場所にあります。
chromium/src/third_party/WebKit/Source/WebCore/inspector/
私は見てきましinspector/front-end/ConsoleView.js
たが、ユーザーコードが実行されている場所を少し見つけたと思います。
evaluateUsingTextPrompt: function(expression, showResultOnly)
{
this._appendCommand(expression, this.prompt.text, false, showResultOnly);
},
小さな脳波。コンソールでこれを行いました
> myEval = eval
> eval = function(str) { console.log(str); myEval(str) }
> }!{
結果:
with ((window && window.console && window.console._commandLineAPI) || {}) {
}!{
}
私は近くにいましたが、今は答えがあります:)
コードはchromium/src/third_party/WebKit/Source/WebCore/inspector/InjectedScriptSource.js
現在440行目あたりで生成されています。
ただの推測。スクリプトがで囲まれ、{}
を使用して実行される場合eval
、これが発生します。
ユーザースクリプト: "}!{"
で囲まれてい{}
ます: "{}!{}"
その後eval("{}!{}")
、false
だから私はこれがブラウザコンソールで起こることだと思います。