コードを実行するこの方法を見ました:
[eval][0]('alert("hello")')
角括弧で囲まれた引用符なしの「eval」の意味と、これが機能する理由を知りたいです。(たとえばwindow['eval'][0]('alert("hello")')
、TypeError が発生します)。そのような構文を説明するチュートリアルはありますか?
コードを実行するこの方法を見ました:
[eval][0]('alert("hello")')
角括弧で囲まれた引用符なしの「eval」の意味と、これが機能する理由を知りたいです。(たとえばwindow['eval'][0]('alert("hello")')
、TypeError が発生します)。そのような構文を説明するチュートリアルはありますか?
それは間接評価呼び出しです
記事からの引用:
ES5 によると、これらはすべて間接呼び出しであり、グローバル スコープでコードを実行する必要があります。
eval
したがって、これらの種類の「トリック」を使用して、現在のスコープではなくグローバルスコープで実行できます。
前に機能する[eval]
のは、0 番目の要素がeval
関数、つまり である配列であり[eval][0] === eval
、文字列を引数として渡して呼び出して'alert("hello")'
います。
JavaScriptで
[x]
を含む 1 つの要素のリストですx
。したがって
[x][0]
は冗長で非効率的な言い方x
です。
あなたの例
[eval][0]('alert("hello")')
したがって、
eval('alert("hello")')
この種の策略は通常、Javascript のトロイの木馬やウイルスに見られ、作成者は何が起こっているのかを偽装しようとします。
ただし、Javascript には特殊なケースeval
が多く、コードで使用すると、ローカル評価ではなくグローバル評価を強制するという意味もあります。
function defun(s) { [eval][0](s); }
function defun2(s) { eval(s); }
defun2("function square(x){return x*x}")
---> undefined
square(12)
---> ReferenceError: square is not defined
defun("function square(x){return x*x}")
---> undefined
square(12)
---> 144
詳細については、Matteo Tassinari の回答リンクを参照してください (リンクされた記事は少し古いため、Webkit の動作に関する詳細は無視してください)。