JavaScript中eval函數(shù)的問題
今天看代碼,遇到一個eval函數(shù)的問題,到現(xiàn)在翻了很多博文,還是不是很懂eval函數(shù),有個一直沒法理解的代碼如下:
/* var start = [] , end = [] , timings = []; */ function f(){ //模擬程序執(zhí)行時間 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函數(shù) } } 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函數(shù)為何會產(chǎn)生這種效果?難道相當于將eval函數(shù)別名化了?
直接調(diào)用eval()時,它總是在調(diào)用它的上下文作用域內(nèi)執(zhí)行,也就是說他可以訪問到repeat函數(shù)中的變量,訪問不到benchmark函數(shù)中的變量,但是在函數(shù)中是能訪問到全局作用域的變量的,所以你把start那些變量設置成全局變量后,又可以返回想要的結果了。
function repeat(n, action){ for(var i=0; i<n ;i++){ start.push(new Date().getTime());f();end.push(new Date().getTime()); // eval函數(shù) } }
repeat中訪問不到start,end變量
相關文章
bootstrap使用validate實現(xiàn)簡單校驗功能
這篇文章主要為大家詳細介紹了bootstrap使用validate實現(xiàn)簡單校驗功能,具有一定的參考價值,感興趣的小伙伴們可以參考一下2016-12-12詳解JavaScript如何控制并發(fā)請求數(shù)量
某些情況下,我們可能需要對需要執(zhí)行的多個異步任務進行異步數(shù)量控制,只允許固定數(shù)量的任務執(zhí)行,本文為大家整理了JS控制并發(fā)請求數(shù)量的相關代碼,希望對大家有所幫助2024-01-01js防抖函數(shù)和節(jié)流函數(shù)使用場景和實現(xiàn)區(qū)別示例分析
這篇文章主要介紹了js防抖函數(shù)和節(jié)流函數(shù)使用場景和實現(xiàn)區(qū)別,結合實例形式詳細分析了js防抖函數(shù)和節(jié)流函數(shù)基本功能、定義、用法區(qū)別及操作注意事項,需要的朋友可以參考下2020-04-04詳解JavaScript中typeof與instanceof用法
typeof用以獲取一個變量或者表達式的類型而instanceof用于判斷一個變量是否某個對象的實例,本文通過實例代碼給大家介紹的非常詳細,具有一定的參考借鑒價值,需要的朋友參考下吧2018-10-10使一個函數(shù)作為另外一個函數(shù)的參數(shù)來運行的javascript代碼
使一個函數(shù)作為另外一個函數(shù)的參數(shù)來運行的javascript代碼...2007-08-08