首頁 > web前端 > js教程 > 主體

JavaScript中eval函數的問題_javascript技巧

WBOY
發布: 2016-05-16 15:16:48
原創
1274 人瀏覽過

今天看程式碼,遇到一個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中的局部变量移到全局就一切正常.
登入後複製

如果我把上面的benchmark中的局部變數移到全域就一切正常.

這裡的eval函數為何會產生這種效果?難道相當於將eval函數別名化了?

當直接呼叫eval()時,它總是在調用它的上下文作用域內執行,也就是說他可以訪問到repeat函數中的變量,訪問不到benchmark函數中的變量,但是在函數中是能訪問到全域作用域的變數的,所以你把start那些變數設定成全域變數後,又可以回傳想要的結果了。

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

repeat中訪問不到start,end變數

相關標籤:
來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板