[angularjs] Angular.js : $ eval은 어떻게 작동하며 왜 vanilla eval과 다른가요?

$scope.$eval지시문에서 자주 볼 수있는 궁금한 점이 있으므로 소스를 확인하고 다음을 발견했습니다 rootScope.js.

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

$parseParseProviderin parse.js에 의해 정의 된 것으로 보이며, 이는 자체의 어떤 종류의 미니 구문을 정의하는 것으로 보입니다 (파일의 길이는 900 줄입니다).

내 질문은 :

  1. 정확히 $eval뭐하는거야? 왜 미니 구문 분석 언어가 필요한가요?

  2. 왜 평범한 오래된 JavaScript eval가 사용되지 않습니까?



답변

$eval$parse자바 스크립트를 평가하지 않는다; AngularJS 표현식 을 평가 합니다 . 링크 된 문서는 표현식과 JavaScript의 차이점을 설명합니다.

Q : $ eval은 정확히 무엇을하고 있습니까? 왜 미니 파싱 언어가 필요한가요?

문서에서 :

표현식은 일반적으로 {{expression}}과 같은 바인딩에 배치되는 JavaScript와 유사한 코드 스 니펫입니다. 식은 $ parse 서비스로 처리됩니다.

JavaScript와 같은 미니 언어로 실행할 수있는 것을 제한하고 (예 : 삼항 연산자를 제외한 제어 흐름 설명 없음) AngularJS의 장점 (예 : 필터)을 추가합니다.

Q : 왜 평범한 오래된 자바 스크립트 “eval”이 사용되지 않습니까?

실제로 JavaScript를 평가하지 않기 때문입니다. 문서에서 말한 것처럼 :

임의의 JavaScript 코드를 실행하려면 컨트롤러 메소드로 만들고 메소드를 호출해야합니다. JavaScript에서 각도 표현식을 eval ()하려면 $ eval () 메소드를 사용하십시오.

위에 링크 된 문서에는 더 많은 정보가 있습니다.


답변

테스트에서

it('should allow passing locals to the expression', inject(function($rootScope) {
  expect($rootScope.$eval('a+1', {a: 2})).toBe(3);

  $rootScope.$eval(function(scope, locals) {
    scope.c = locals.b + 4;
  }, {b: 3});
  expect($rootScope.c).toBe(7);
}));

평가 표현을 위해 지역을 전달할 수도 있습니다.


답변

나는 여기서 원래의 질문 중 하나가 대답하지 않았다고 생각합니다. 바닐라 eval ()은 각도 앱이 Chrome 앱으로 작동하지 않아 보안상의 이유로 eval ()이 명시 적으로 사용되지 않기 때문에 사용되지 않는다고 생각합니다.


답변