strictモードが提供する保証の1つは、strict関数コードでは、識別子arguments
が常にその関数のArgumentsオブジェクトを参照することです。
function fn () {
'use strict';
// malicious code
arguments // still refers to the function's Arguments object
}
したがって、どのコードがに挿入されても、関数の呼び出し全体を通じて// malicious code
、arguments
識別子は関数のArgumentsオブジェクトに不変にバインドされます。
同じ保証がeval
識別子に提供されているかどうか疑問に思いました。つまり、保証付きの識別子は常にeval
組み込みのグローバル関数を参照していますか?eval
厳密なコードが非厳密なコード内にネストされている場合、上記の保証は提供されないことを指摘しておきます。非厳密なコードでは、ローカル"eval"
バインディングを作成したり、グローバル"eval"
バインディングを変更したりできます。(また、(複数のスクリプトを含むWebページのように)別の非厳密なプログラムが同じグローバルオブジェクトを使用する場合、上記の保証も提供されません。)
したがって、この質問のために、次のシナリオを定義したいと思います。
- 私たちのプログラムはスタンドアロンです。つまり、グローバルオブジェクトを他のプログラムと共有しません。
私たちのプログラムは、次のように単一の厳密なIIFEで構成されています。
(function () { 'use strict'; // malicious code eval // does it still refer to the built-in global eval function? }());
これらの条件を前提として、でコードを挿入することは可能ですか?それは識別子\\ malicious code
の値を変更しますか?eval