Als ich mir heute den Code ansah, bin ich auf ein Problem mit der Bewertungsfunktion gestoßen. Ich habe viele Blog-Beiträge gelesen, aber ich verstehe die Bewertungsfunktion immer noch nicht wie folgt verstehen:
/* 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中的局部变量移到全局就一切正常.
Wenn ich die lokalen Variablen im obigen Benchmark in die globalen verschiebe, funktioniert alles einwandfrei.
Warum erzeugt die Auswertungsfunktion hier diesen Effekt? Ist es gleichbedeutend mit einem Aliasing der Auswertungsfunktion?
Wenn eval() direkt aufgerufen wird, wird es immer im Kontextbereich des Aufrufs ausgeführt, was bedeutet, dass es auf die Variablen in der Wiederholungsfunktion zugreifen kann, aber nicht auf die Variablen in der Benchmark-Funktion, aber darauf kann zugegriffen werden in der Funktion Zugriff auf Variablen im globalen Bereich, sodass Sie die gewünschten Ergebnisse zurückgeben können, nachdem Sie die Startvariablen auf globale Variablen festgelegt haben.
function repeat(n, action){ for(var i=0; i<n ;i++){ start.push(new Date().getTime());f();end.push(new Date().getTime()); // eval函数 } }
Auf die Start- und Endvariablen kann nicht wiederholt zugegriffen werden