1

コードを実行するこの方法を見ました:

[eval][0]('alert("hello")')  

角括弧で囲まれた引用符なしの「eval」の意味と、これが機能する理由を知りたいです。(たとえばwindow['eval'][0]('alert("hello")')、TypeError が発生します)。そのような構文を説明するチュートリアルはありますか?

4

4 に答える 4

6

それは間接評価呼び出しです

記事からの引用:

ES5 によると、これらはすべて間接呼び出しであり、グローバル スコープでコードを実行する必要があります。

evalしたがって、これらの種類の「トリック」を使用して、現在のスコープではなくグローバルスコープで実行できます。

前に機能する[eval]のは、0 番目の要素がeval関数、つまり である配列であり[eval][0] === eval、文字列を引数として渡して呼び出して'alert("hello")'います。

于 2013-10-22T06:23:26.370 に答える
1

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 の動作に関する詳細は無視してください)。

于 2013-10-22T06:25:59.163 に答える