Eu estava curioso sobre o que $scope.$eval
você costuma ver nas diretivas, então verifiquei a fonte e encontrei o seguinte em rootScope.js
:
$eval: function(expr, locals) {
return $parse(expr)(this, locals);
},
$parse
parece ser definido por ParseProvider
in parse.js
, que parece definir algum tipo de mini-sintaxe própria (o arquivo tem 900 linhas).
Minhas perguntas são:
O que exatamente está
$eval
fazendo? Por que ele precisa de sua própria mini linguagem de análise?Por que o JavaScript antigo simples não está
eval
sendo usado?
$parse
é incrivelmente ótimo.Respostas:
$eval
e$parse
não avalie o JavaScript; eles avaliam expressões AngularJS . A documentação vinculada explica as diferenças entre expressões e JavaScript.P: O que exatamente $ eval está fazendo? Por que ele precisa de sua própria mini linguagem de análise?
Dos documentos:
É uma mini-linguagem semelhante ao JavaScript que limita o que você pode executar (por exemplo, nenhuma declaração de fluxo de controle, exceto o operador ternário), além de acrescentar um pouco da qualidade do AngularJS (por exemplo, filtros).
P: Por que o javascript antigo "eval" não está sendo usado?
Porque na verdade não está avaliando JavaScript. Como dizem os documentos:
Os documentos vinculados acima têm muito mais informações.
fonte
$eval
não avalia JavaScript; avalia expressões AngularJS, que são como um subconjunto mais seguro de JavaScript."{id: 'val'}"
é uma expressão AngularJS válida e deve retornar um objeto JS válido. Veja o link acima para saber a diferença entre expressões e JS regulares.Do teste,
Também podemos transmitir locais para expressão de avaliação.
fonte
Acho que uma das perguntas originais aqui não foi respondida. Acredito que vanilla eval () não seja usada porque aplicativos angulares não funcionariam como aplicativos Chrome, o que impede explicitamente que eval () seja usado por razões de segurança.
fonte