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 相关文章推荐
JavaScript 事件记录使用说明
Oct 20 Javascript
JavaScript 语法集锦 脚本之家基础推荐
Nov 15 Javascript
JavaScript中的私有/静态属性介绍
Jul 26 Javascript
基于jQuery中对数组进行操作的方法
Apr 16 Javascript
jQuery淡入淡出元素让其效果更为生动
Sep 01 Javascript
优化Node.js Web应用运行速度的10个技巧
Sep 03 Javascript
使用不同的方法结合/合并两个JS数组
Sep 18 Javascript
浅谈js中变量初始化
Feb 03 Javascript
jQuery实现响应鼠标滚动的动感菜单效果
Sep 21 Javascript
判断横屏竖屏(三种)
Feb 13 Javascript
Vue列表页渲染优化详解
Jul 24 Javascript
详解vue数组遍历方法forEach和map的原理解析和实际应用
Nov 15 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
php中的观察者模式
2010/03/24 PHP
PHP 自定义错误处理函数trigger_error()
2013/03/26 PHP
PHP中你应该知道的require()文件包含的正确用法
2015/06/12 PHP
php发送短信验证码完成注册功能
2015/11/24 PHP
JavaScript 比较时间大小的代码
2010/04/24 Javascript
自制基于jQuery的智能提示插件一枚
2011/02/18 Javascript
js操纵跨frame的三级联动select下拉选项实例介绍
2013/05/19 Javascript
node.js微信公众平台开发教程
2016/03/04 Javascript
js控制TR的显示隐藏
2016/03/04 Javascript
JS实现显示带倒影的图片横排居中放大展示特效实例【测试可用】
2016/08/23 Javascript
浅谈移动端之js touch事件 手势滑动事件
2016/11/07 Javascript
js 博客内容进度插件详解
2017/02/19 Javascript
js实现瀑布流效果(自动生成新的内容)
2017/03/16 Javascript
ES6新特性:使用export和import实现模块化详解
2017/07/31 Javascript
vue axios请求超时的正确处理方法
2018/04/02 Javascript
vue中mint-ui的使用方法
2018/04/04 Javascript
详解create-react-app 2.0版本如何启用装饰器语法
2018/10/23 Javascript
微信小程序实现录音时的麦克风动画效果实例
2019/05/18 Javascript
vue引入微信sdk 实现分享朋友圈获取地理位置功能
2019/07/04 Javascript
基于JS正则表达式实现模板数据动态渲染(实现思路详解)
2020/03/07 Javascript
vue组件系列之TagsInput详解
2020/05/14 Javascript
vue+element UI实现树形表格
2020/12/29 Vue.js
python操作excel的方法(xlsxwriter包的使用)
2018/06/11 Python
Python面向对象进阶学习
2019/05/21 Python
Django之提交表单与前后端交互的方法
2019/07/19 Python
常用python爬虫库介绍与简要说明
2020/01/25 Python
python 实现读取csv数据,分类求和 再写进 csv
2020/05/18 Python
美国真皮手袋品牌:GiGi New York
2017/03/10 全球购物
L*SPACE官网:比基尼、泳装和度假服装
2019/03/18 全球购物
补充协议书范本
2014/04/23 职场文书
社保转移委托书范本
2014/10/08 职场文书
烟台的海导游词
2015/02/02 职场文书
导游词之平津战役纪念馆
2019/11/04 职场文书
oracle通过存储过程上传list保存功能
2021/05/12 Oracle
详解JVM系列之内存模型
2021/06/10 Javascript
Python Pytorch查询图像的特征从集合或数据库中查找图像
2022/04/09 Python