JavaScript中eval函数的问题


Posted in Javascript onJanuary 31, 2016

今天看代码,遇到一个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变量

Javascript 相关文章推荐
json 入门基础教程 推荐
Oct 31 Javascript
JavaScript 判断浏览器是否支持SVG的代码
Mar 21 Javascript
Node.js生成HttpStatusCode辅助类发布到npm
Apr 09 Javascript
js中widow.open()方法使用详解
Jul 30 Javascript
Jquery实现由下向上展开效果的例子
Dec 08 Javascript
javascript每日必学之条件分支
Feb 17 Javascript
confirm确认对话框的实现方法总结
Jun 17 Javascript
详解vue+vueRouter+webpack的简单实例
Jun 17 Javascript
Vue的elementUI实现自定义主题方法
Feb 23 Javascript
vue项目设置scrollTop不起作用(总结)
Dec 21 Javascript
JavaScript实现身份证验证代码实例
Aug 26 Javascript
JS面向对象编程——ES6 中class的继承用法详解
Mar 03 Javascript
JS排序方法(sort,bubble,select,insert)代码汇总
Jan 30 #Javascript
JavaScript中的this机制
Jan 30 #Javascript
实现高性能JavaScript之执行与加载
Jan 30 #Javascript
深入探秘jquery瀑布流的实现
Jan 30 #Javascript
深入分析Javascript事件代理
Jan 30 #Javascript
详解javascript实现瀑布流列式布局
Jan 29 #Javascript
详解javascript实现瀑布流绝对式布局
Jan 29 #Javascript
You might like
不用数据库的多用户文件自由上传投票系统(2)
2006/10/09 PHP
用php实现批量查询清除一句话后门的代码
2008/01/20 PHP
PHP+MYSQL 出现乱码的解决方法
2008/08/08 PHP
解析PHP中DIRECTORY_SEPARATOR,PATH_SEPARATOR两个常量的作用
2013/06/21 PHP
使用纯php代码实现页面伪静态的方法
2015/07/25 PHP
php微信公众号开发之欢迎老朋友
2018/10/20 PHP
Laravel5.1框架注册中间件的三种场景详解
2019/07/09 PHP
Jquery Select操作方法集合脚本之家特别版
2010/05/17 Javascript
基于Jquery的动态创建DOM元素的代码
2010/12/28 Javascript
window.open以post方式将内容提交到新窗口
2012/12/26 Javascript
在图片上显示左右箭头类似翻页的代码
2013/03/04 Javascript
js设置组合快捷键/tabindex功能的方法
2013/11/21 Javascript
js判断游览器类型及版本号的代码
2014/05/11 Javascript
jQuery多条件筛选如何实现
2015/11/04 Javascript
浅谈String.valueOf()方法的使用
2016/06/06 Javascript
jquery 获取select数组与name数组长度的实现代码
2016/06/20 Javascript
Bootstrap如何激活导航状态
2017/03/22 Javascript
一个Vue视频媒体多段裁剪组件的实现示例
2018/08/09 Javascript
vue 实现Web端的定位功能 获取经纬度
2019/08/08 Javascript
在vue中把含有html标签转为html渲染页面的实例
2019/10/28 Javascript
使用preload预加载页面资源时注意事项
2020/02/03 Javascript
[52:06]完美世界DOTA2联赛决赛日 Inki vs LBZS 第一场 11.08
2020/11/10 DOTA
python实现给字典添加条目的方法
2014/09/25 Python
在Linux下使用Python的matplotlib绘制数据图的教程
2015/06/11 Python
Python计算一个文件里字数的方法
2015/06/15 Python
Python unittest模块用法实例分析
2018/05/25 Python
python 格式化输出百分号的方法
2019/01/20 Python
使用Python画股票的K线图的方法步骤
2019/06/28 Python
Django的models中on_delete参数详解
2019/07/16 Python
Django CBV模型源码运行流程详解
2020/08/17 Python
俄罗斯三星品牌商店:Samsungstore
2020/04/05 全球购物
数学与统计学院学生个人职业生涯规划书
2014/02/10 职场文书
汽车检测与维修专业求职信
2014/07/04 职场文书
心理咨询专业自荐信
2014/07/07 职场文书
捐资助学感谢信
2015/01/21 职场文书
纯 CSS 自定义多行省略的问题(从原理到实现)
2021/11/11 HTML / CSS