En regardant le code aujourd'hui, j'ai rencontré un problème avec la fonction eval. J'ai lu beaucoup d'articles de blog, mais je ne comprends toujours pas très bien la fonction eval. comprendre comme suit :
/* 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中的局部变量移到全局就一切正常.
Si je déplace les variables locales du benchmark ci-dessus vers le global, tout fonctionne bien.
Pourquoi la fonction eval produit-elle ici cet effet ? Est-ce équivalent à aliaser la fonction eval ?
Lorsque eval() est appelé directement, il est toujours exécuté dans le contexte de son appel, ce qui signifie qu'il peut accéder aux variables de la fonction de répétition mais ne peut pas accéder aux variables de la fonction de référence, mais il est accessible dans la fonction. Accès aux variables dans la portée globale, donc après avoir défini les variables de démarrage sur des variables globales, vous pouvez renvoyer les résultats souhaités.
function repeat(n, action){ for(var i=0; i<n ;i++){ start.push(new Date().getTime());f();end.push(new Date().getTime()); // eval函数 } }
Les variables de début et de fin ne sont pas accessibles en répétition