new Function(...)
非常に削減されたコードから関数を生成するために使用したいと思います。私はこれをしたい
- 自分で式を解析することを避け、
- 可能な限り柔軟であること。
eval()
私は可能な限り避けます。new Function(...)
しかし、セキュリティ ホールが発生しやすいことでも知られている、使用するのに十分な安全性があるかどうかはわかりません。
バックグラウンド
メニューボタンの状態を管理したい。したがって、ボタンを定義しながら、次のようなものを書きたいと思います
{
..., // More button definition
state: "isInEditmode && (isWidgetSelected || isCursorInWidget),
...
}
いくつかのイベント中に statechange を処理しながら、現在の全体的な状態オブジェクトの状態をstates
属性の状態と照合 (要約) します。
したがって、レンダリング時に関数を生成し、DOM 属性ではなく DOMオブジェクト属性としてこのようにアタッチします。
...
$el.stateFn = new Function("stateObj", "with (stateObj) {return " + item.state + ";}");
...
テスト状態:
visible = $el.stateFn.call(currentStates, currentStates);
このwith
ステートメントは、現在のstate
オブジェクトの属性を変数として提供するのに役立ちます。これにより、上記の式で のようなものが必要なくなりますobj.isInEditmode
。
秘密の質問
私の意見では、DOM オブジェクトに関連付けられた関数はレンダリング時に生成され、ソースから読み取られるため、これによってセキュリティ ホールが発生することはありません。それとも私が間違っていますか?これを避けるべきですか?
Function
パフォーマンスのヒントは高く評価されます (コメント) (レンダリング時に新しいものを 1 回評価する限り、これは許容できると思います)。
編集 1
- Backbone.js を使用しています。別のフレームワークを使用することは論外です。
- 一部のメニュー項目は、異なるモデルまたは複数のモデルにバインドする必要があります。
- 委任 (またはファサード/プロキシ?) モデルは重要です。