Saya ingin tahu tentang $scope.$eval
Anda yang sering dilihat dalam arahan, jadi saya memeriksa sumbernya dan menemukan yang berikut di rootScope.js
:
$eval: function(expr, locals) {
return $parse(expr)(this, locals);
},
$parse
tampaknya didefinisikan oleh ParseProvider
in parse.js
, yang tampaknya mendefinisikan beberapa jenis sintaks mini sendiri (panjang file 900 baris).
Pertanyaan saya adalah:
Apa yang sedang
$eval
dilakukan? Mengapa perlu bahasa parsing mini sendiri?Mengapa JavaScript lama
eval
tidak digunakan?
$parse
luar biasa hebat.Jawaban:
$eval
dan$parse
jangan mengevaluasi JavaScript; mereka mengevaluasi ekspresi AngularJS . Dokumentasi tertaut menjelaskan perbedaan antara ekspresi dan JavaScript.T: Apa yang sebenarnya dilakukan $ eval? Mengapa perlu bahasa parsing mini sendiri?
Dari dokumen:
Ini adalah bahasa mini seperti JavaScript yang membatasi apa yang dapat Anda jalankan (mis. Tidak ada pernyataan aliran kontrol, kecuali operator ternary) serta menambahkan beberapa kebaikan AngularJS (mis. Filter).
T: Mengapa javascript lama biasa "eval" tidak digunakan?
Karena itu sebenarnya tidak mengevaluasi JavaScript. Seperti yang dikatakan para dokter:
Dokumen yang ditautkan ke atas memiliki lebih banyak informasi.
sumber
$eval
tidak mengevaluasi JavaScript; itu mengevaluasi ekspresi AngularJS, yang merupakan semacam bagian yang lebih aman dari JavaScript."{id: 'val'}"
adalah ekspresi AngularJS yang valid dan harus mengembalikan objek JS yang valid. Lihat tautan di atas untuk perbedaan antara ekspresi dan JS biasa.Dari tes,
Kami juga dapat melewati penduduk setempat untuk ekspresi evaluasi.
sumber
Saya pikir salah satu pertanyaan asli di sini tidak dijawab. Saya percaya bahwa vanilla eval () tidak digunakan karena aplikasi bersudut maka tidak akan berfungsi sebagai aplikasi Chrome, yang secara eksplisit mencegah eval () digunakan untuk alasan keamanan.
sumber