Rumah  >  Artikel  >  hujung hadapan web  >  Masalah dengan fungsi eval dalam kemahiran JavaScript_javascript

Masalah dengan fungsi eval dalam kemahiran JavaScript_javascript

WBOY
WBOYasal
2016-05-16 15:16:481270semak imbas

Melihat kod hari ini, saya menghadapi masalah dengan fungsi eval Saya telah membaca banyak catatan blog, tetapi saya masih tidak memahami fungsi eval dengan baik faham seperti berikut:

/*
var start = []
 , end = []
 , timings = [];
*/
function f(){
 //模拟程序执行时间
 var sum = 0;
 for(var i =0 ;i < 100000; i++){
  sum = sum/(i+1);
 }
}
function repeat(n, action){
 for(var i=0; i<n ;i++){
  eval(action); // eval函数
 }
}
function benchmark(){
 var start = []
  , end = []
  , timings = [];
 repeat(100, "start.push(new Date().getTime());f();end.push(new Date().getTime())");
 for (var i =0; i< start.length; i++){
  timings[i] = end[i] - start[i];
 }
 return timings;
}
benchmark(); //结果为:[]
//如果我把上面的benchmark中的局部变量移到全局就一切正常.

Jika saya mengalihkan pembolehubah setempat dalam penanda aras di atas ke global, semuanya berfungsi dengan baik.

Mengapa fungsi eval di sini menghasilkan kesan ini? Adakah ia bersamaan dengan alias fungsi eval?

Apabila eval() dipanggil terus, ia sentiasa dilaksanakan dalam skop konteks memanggilnya, yang bermaksud ia boleh mengakses pembolehubah dalam fungsi ulangan tetapi tidak boleh mengakses pembolehubah dalam fungsi penanda aras, tetapi ia boleh diakses dalam fungsi Akses kepada pembolehubah dalam skop global, jadi selepas anda menetapkan pembolehubah permulaan kepada pembolehubah global, anda boleh mengembalikan hasil yang diingini.

function repeat(n, action){
 for(var i=0; i<n ;i++){
  start.push(new Date().getTime());f();end.push(new Date().getTime()); // eval函数
 }
}

Pembolehubah mula dan akhir tidak boleh diakses secara berulang

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn