1. ホーム
  2. angularjs

[解決済み] Angular.js: $evalの仕組みとバニラevalとの違いは何ですか?

2022-03-08 08:59:32

質問

について気になったので $scope.$eval ディレクティブでよく見かけるので、ソースをチェックしてみると、以下のように rootScope.js :

  $eval: function(expr, locals) {
    return $parse(expr)(this, locals);
  },

$parse で定義されているように見える。 ParseProviderparse.js は、それ自体がある種のミニ構文を定義しているように見えます(ファイルは900行に及びます)。

私の疑問は

  1. とは、具体的にどのようなものなのでしょうか? $eval は何をしているのか? なぜ独自のミニ解析言語が必要なのでしょうか?

  2. なぜ古いJavaScriptではダメなのか? eval が使われているのでしょうか?

解決方法は?

$eval$parse はJavaScriptを評価するのではなく、AngularJSを評価します。 表現 . リンク先のドキュメントでは、式とJavaScriptの違いについて説明しています。

Q: $evalはいったい何をしているのですか?なぜ独自のミニ解析言語が必要なのですか?

ドキュメントより

式はJavaScriptのようなコードスニペットで、通常{{式 }}のようなバインディングに置かれます。式は $parse サービスによって処理されます。

これはJavaScriptのようなミニ言語で、実行できるものを制限し(例えば三項演算子以外の制御フロー文は不可)、さらにAngularJSの良さ(例えばフィルター)を追加しています。

Q: なぜ古いjavascript "eval"は使われないのですか?

なぜなら、実際にJavaScriptを評価しているわけではないからです。ドキュメントに書いてある通りです。

もし、任意のJavaScriptコードを実行したいのであれば、それをコントローラのメソッドにして、メソッドを呼び出す必要があります。もし、JavaScriptからangular式をeval()したい場合は、$eval()メソッドを使用してください。

上記リンク先のドキュメントには、より多くの情報が掲載されています。