すべてのアイデアのおかげで、すべてが圧縮された後、基本的に $EVAL$ を eval に置き換えて、JS を出力するビルド スクリプトでテキスト置換を行うことになりました。私は純粋に JS の方法を望んでいましたが、非常に多くの異なる eval ブラウザー実装があるため、おそらく eval をそのままにしておく方がよいでしょう。
しかし、ディミターの答えといくつかのいじりに基づいて、ここに私が見つけたものがあります. this['eval'] が機能しなかった理由は、MooTools の JSON.decode で発生している場所がハッシュ内でもあるためです。
var JSON = new Hash({
// snip snip
decode: function(string, secure) {
if ($type(string) != 'string' || !string.length) return null;
if (secure && !(/^[,:{}\[\]0-9.\-+Eaeflnr-u \n\r\t]*$/).test(string.replace(/\\./g, '@').replace(/"[^"\\\n\r]*"/g, ''))) return null;
return this.eval('(' + string + ')'); // Firefox says: TypeError: this.eval is not a function
}
});
ただし、「トップ レベル」のローカル スコープ (mootools を含むすべてのコードが無名関数内で実行される) を保存すると、次のように動作します。
var TOP = this;
var JSON = new Hash({
// snip snip
decode: function(string, secure) {
if ($type(string) != 'string' || !string.length) return null;
if (secure && !(/^[,:{}\[\]0-9.\-+Eaeflnr-u \n\r\t]*$/).test(string.replace(/\\./g, '@').replace(/"[^"\\\n\r]*"/g, ''))) return null;
return TOP.eval('(' + string + ')'); // All good, things run within the desired scope.
}
});
ただし、これは Safari では機能しないため、結論として、私がやろうとしていたことは相互互換性を持って実行できません。eval は特殊な扱いやすい関数であり、ブラウザーごとに扱いが異なります。