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 相关文章推荐
基于JQuery制作的产品广告效果
Dec 08 Javascript
JQuery设置时间段下拉选择实例
Dec 30 Javascript
JavaScript中的各种操作符使用总结
May 26 Javascript
AngularJS基础 ng-mousemove 指令简单示例
Aug 02 Javascript
深入理解javascript的getTime()方法
Feb 16 Javascript
JS获取子、父、兄节点方法小结
Aug 14 Javascript
用Axios Element实现全局的请求loading的方法
Mar 15 Javascript
微信小程序中换行空格(多个空格)写法详解
Jul 10 Javascript
JavaScript 复制对象与Object.assign方法无法实现深复制
Nov 02 Javascript
js/jQuery实现全选效果
Jun 17 jQuery
JQuery获得内容和属性方法解析
May 30 jQuery
基于p5.js 2D图像接口的扩展(交互实现)
Nov 30 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代码
2008/04/09 PHP
PHP中使用数组实现堆栈数据结构的代码
2012/02/05 PHP
Laravel 4 初级教程之安装及入门
2014/10/30 PHP
Zend Framework上传文件重命名的实现方法
2016/11/25 PHP
老生常谈PHP面向对象之标识映射
2017/06/21 PHP
浅谈JSON和JSONP区别及jQuery的ajax jsonp的使用
2014/11/23 Javascript
jQuery中设置form表单中action值的实现方法
2016/05/25 Javascript
基于原生JS实现图片裁剪
2016/08/01 Javascript
jquery二级目录选中当前页的css样式
2016/12/08 Javascript
js实现鼠标拖动功能
2017/03/20 Javascript
Angularjs的$http异步删除数据详解及实例
2017/07/27 Javascript
vue awesome swiper异步加载数据出现的bug问题
2018/07/03 Javascript
json字符串对象转换代码实例
2019/09/28 Javascript
简单实现节流函数和防抖函数过程解析
2019/10/08 Javascript
原生JS与JQ获取元素的区别详解
2020/02/13 Javascript
jQuery实现二级导航菜单的示例
2020/09/30 jQuery
Ant design vue table 单击行选中 勾选checkbox教程
2020/10/24 Javascript
[05:09]第二届DOTA2亚洲邀请赛决赛日比赛集锦:iG 3:0 OG夺冠
2017/04/05 DOTA
比较详细Python正则表达式操作指南(re使用)
2008/09/06 Python
python实现超简单端口转发的方法
2015/03/13 Python
python贪婪匹配以及多行匹配的实例讲解
2018/04/19 Python
Python实现按当前日期(年、月、日)创建多级目录的方法
2018/04/26 Python
python 用opencv调用训练好的模型进行识别的方法
2018/12/07 Python
python 抓包保存为pcap文件并解析的实例
2019/07/23 Python
如何更改 pandas dataframe 中两列的位置
2019/12/27 Python
Python reshape的用法及多个二维数组合并为三维数组的实例
2020/02/07 Python
Python基于Dlib的人脸识别系统的实现
2020/02/26 Python
python实现一个简单RPC框架的示例
2020/10/28 Python
拥有超过850家商店的美国在线派对商店:Party City
2018/10/21 全球购物
医学生职业规划范文
2014/01/05 职场文书
通信工程求职信
2014/07/16 职场文书
三八妇女节趣味活动方案
2014/08/23 职场文书
2014年人事工作总结范文
2014/11/19 职场文书
婚庆开业庆典主持词
2015/06/30 职场文书
goland 设置project gopath的操作
2021/05/06 Golang
SQL中的三种去重方法小结
2021/11/01 SQL Server