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 相关文章推荐
Web跨浏览器进程通信(Web跨域)
Apr 17 Javascript
js实现select跳转功能代码
Oct 22 Javascript
jQuery插件imgPreviewQs实现上传图片预览
Jan 15 Javascript
Bootstrap table表格简单操作
Feb 07 Javascript
微信小程序canvas写字板效果及实例
Jun 15 Javascript
React Native第三方平台分享的实例(Android,IOS双平台)
Aug 04 Javascript
IScroll5实现下拉刷新上拉加载的功能实例
Aug 11 Javascript
通过button将form表单的数据提交到action层的实例
Sep 08 Javascript
mui框架 页面无法滚动的解决方法(推荐)
Jan 25 Javascript
代码整洁之道(重构)
Oct 25 Javascript
uni-app实现点赞评论功能
Nov 25 Javascript
前端使用crypto.js进行加密的函数代码
Aug 16 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
雄兵连:第三季确定会出,不过时间未定,鹤熙是第三季的主角!
2020/03/13 国漫
修改了一个很不错的php验证码(支持中文)
2007/02/14 PHP
实用的简单PHP分页集合包括使用方法
2013/10/21 PHP
php实现邮件发送并带有附件
2014/01/24 PHP
php格式化金额函数分享
2015/02/02 PHP
php检索或者复制远程文件的方法
2015/03/13 PHP
php框架CI(codeigniter)自动加载与自主创建对象操作实例分析
2020/06/06 PHP
jQuery中:image选择器用法实例
2015/01/03 Javascript
如何减少浏览器的reflow和repaint
2015/02/26 Javascript
JavaScript实现的经典文件树菜单效果
2015/09/08 Javascript
jQuery+ajax简单实现文件上传的方法
2016/06/03 Javascript
BOM系列第一篇之定时器setTimeout和setInterval
2016/08/17 Javascript
微信小程序开发探究
2016/12/27 Javascript
很棒的一组js图片轮播特效
2017/01/12 Javascript
JavaScript实现网页头部进度条刷新
2017/04/16 Javascript
详解如何用webpack打包一个网站应用项目
2017/07/12 Javascript
Webpack实战加载SVG的方法
2017/12/26 Javascript
vue实现在v-html的html字符串中绑定事件
2019/10/28 Javascript
js与jquery获取input输入框中的值实例讲解
2020/02/27 jQuery
使用next.js开发网址缩短服务的方法
2020/06/17 Javascript
[52:22]EG vs VG Supermajor小组赛B组 BO3 第一场 6.2
2018/06/03 DOTA
python读取中文txt文本的方法
2018/04/12 Python
Python实现读取SQLServer数据并插入到MongoDB数据库的方法示例
2018/06/09 Python
python 画二维、三维点之间的线段实现方法
2019/07/07 Python
如何使用python操作vmware
2019/07/27 Python
pygame实现俄罗斯方块游戏(基础篇1)
2019/10/29 Python
Numpy 理解ndarray对象的示例代码
2020/04/03 Python
Django Model中字段(field)的各种选项说明
2020/05/19 Python
python 写一个文件分发小程序
2020/12/05 Python
CSS3 Backgrounds属性相关介绍
2011/05/11 HTML / CSS
HTML5所有标签汇总及标签意义解释
2015/03/12 HTML / CSS
Yankee Candle官网:美国最畅销蜡烛品牌之一
2020/01/05 全球购物
研究生自荐信
2013/10/09 职场文书
学术会议邀请函范文
2014/01/22 职场文书
党员自我剖析材料范文
2014/10/06 职场文书
深度学习tensorflow基础mnist
2021/04/14 Python