오늘 코드를 보다가 eval 함수에 문제가 생겼습니다. 많은 블로그 게시물을 읽었지만 여전히 eval 함수를 잘 이해하지 못하는 코드가 있습니다. 다음과 같이 이해하세요:
/* 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中的局部变量移到全局就一切正常.
위 벤치마크의 로컬 변수를 전역 변수로 옮기면 모든 것이 잘 됩니다.
여기서 eval 함수가 왜 이런 효과를 내나요? eval 함수의 별칭을 지정하는 것과 동일합니까?
eval()이 직접 호출되면 항상 호출한 컨텍스트 범위 내에서 실행되는데, 이는 반복 함수에서는 변수에 액세스할 수 있지만 벤치마크 함수에서는 변수에 액세스할 수 없지만 액세스할 수 있다는 의미입니다. 함수에서 전역 범위의 변수에 액세스하므로 시작 변수를 전역 변수로 설정한 후 원하는 결과를 반환할 수 있습니다.
function repeat(n, action){ for(var i=0; i<n ;i++){ start.push(new Date().getTime());f();end.push(new Date().getTime()); // eval函数 } }
반복에서는 시작 변수와 끝 변수에 접근할 수 없습니다