programing

$parse 대 $eval ? 어떤 것이 최선의 방법입니까?

codeshow 2023. 10. 4. 23:06
반응형

$parse 대 $eval ? 어떤 것이 최선의 방법입니까?

나는 그것을 알고 있습니다.$parse그리고.$eval둘 다 Angular 식으로 작동합니다.그럼 왜 Angular 팀이 이 두개를 만들었을까요?

각 도서관에서 확인해봤는데,$eval다음과 같이 정의됩니다.

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

그렇다면 다음과 다른 점은 무엇입니까?

$parse(expr)(context, locals);

그리고.

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

어떤 것이 가장 좋은 방법인지 알고 싶습니다. 그리고 이 두 가지를 언제 사용해야 합니까?

당신이 알아차린 것처럼,

$parse(expr)($scope, locals)

정확히 동치입니다.

$scope.$eval(expr, locals)

그렇지만,$parse보다 "fundament" 작업입니다.$eval, 그래서, 당신은 할 수 있습니다.$parse한 곳에 한 번(예: 인)compile명령의 함수):

var parsedExpr = $parse(tAttrs.p1);

그리고 다른 곳에서 반복적으로 사용합니다 (예를 들어, a에서).controller함수)

var childScope1 = $scope.$new();
var childScope2 = $scope.$new();

var r1 = parsedExpr(childScope1);
var r2 = parsedExpr(childScope2);

제 생각에 중요한 차이점은$evalscope현재 범위에 대한 식을 실행하는 방법.$parse는 (전 세계적으로 사용 가능한) 서비스입니다.

이렇게 말씀하시면 됩니다.$parse(expr)(context, locals);, 어떤 맥락이든 간에, 그러나 의 경우에는.$evalcontext가 될 것입니다scope.

$eval은 현재 범위에 대해 $parse을 사용합니다.

당신이 가지고 있다고 치자.

$scope.a = 2;
$scope.b = 4;

$parse("a*b")결과를 얻기 위해 컨텍스트/객체/범위에 대해 평가해야 하는 함수를 제공합니다.

그래서 이제

var f = $parse("a*b");

var result = f($scope);우리는 $scope에 적용되는 함수인 $ parse의 출력을 사용하고 있습니다.

참고:

  1. $eval는 항상 현재 범위를 기준으로 식을 평가하고 결과를 반환합니다. 예:console.log($scope.$eval("a*b")); // 8

  2. $parse함수만 반환하고 스코프에서는 작동하지 않습니다.예:

    var func = $parse("a*b");
    

지금이다func에 적용할 수 있는

  1. 모든 범위

    var result = func($scope);
    console.log(result); // 8
    
  2. 물건

    var result1 = func({a:3 , b:3});    
    console.log(result1); // 9
    

따라서 한 번 파싱한 동일한 식을 범위 또는 객체에 대해 평가할 수 있습니다.

전에 말씀드린 바와 같이, 에 대해.$eval각진 용법$parse식을 평가하고 결과를 반환하기 위한 현재 범위를 배경으로 합니다.

동일한 식에 대해 여러 컨텍스트를 실행하려면$parse최선의 선택입니다.

".$eval ()"는 수식(및 선택적으로 로컬)을 취한 다음 "$parse()"를 사용하여 현재 범위에 대해 실행하는 간단한 범위 메서드입니다.

"$parse()" 서비스는 마법이 일어나는 곳입니다.각 표현식을 사용하고 함수를 반환하는데, 함수는 "context"와 "locals" 두 개의 인수를 사용합니다.후자는 컨텍스트에 설정된 변수를 재정의하는 데 사용됩니다.문맥이 핵심 부분입니다.

$scope.foo = 3;
var parseFn = $parse(‘foo = 5’);
parseFn($scope);
$scope.foo; // returns 5

또는 그보다 짧음:

$scope.foo = 3;
$scope.$eval(‘foo = 5’);
$scope.foo; // returns 5

언급URL : https://stackoverflow.com/questions/29870806/parse-vs-eval-which-one-is-best-practice

반응형