$scope.$eval
지시문에서 자주 볼 수있는 궁금한 점이 있으므로 소스를 확인하고 다음을 발견했습니다 rootScope.js
.
$eval: function(expr, locals) {
return $parse(expr)(this, locals);
},
$parse
ParseProvider
in parse.js
에 의해 정의 된 것으로 보이며, 이는 자체의 어떤 종류의 미니 구문을 정의하는 것으로 보입니다 (파일의 길이는 900 줄입니다).
내 질문은 :
-
정확히
$eval
뭐하는거야? 왜 미니 구문 분석 언어가 필요한가요? -
왜 평범한 오래된 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 ()이 명시 적으로 사용되지 않기 때문에 사용되지 않는다고 생각합니다.