JavaScript中eval函数的问题
2016-01-31 00:00
766 查看
今天看代码,遇到一个eval函数的问题,到现在翻了很多博文,还是不是很懂eval函数,有个一直没法理解的代码如下:
如果我把上面的benchmark中的局部变量移到全局就一切正常.
这里的eval函数为何会产生这种效果?难道相当于将eval函数别名化了?
直接调用eval()时,它总是在调用它的上下文作用域内执行,也就是说他可以访问到repeat函数中的变量,访问不到benchmark函数中的变量,但是在函数中是能访问到全局作用域的变量的,所以你把start那些变量设置成全局变量后,又可以返回想要的结果了。
repeat中访问不到start,end变量
/* 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嵌套函数和在函数内调用外部函数的区别分析
- Servlet生命周期与工作原理
- 原生javascript ajax提交
- js(Extjs6.0 ) 构建二维数组,用于显示到highchart柱状图中。
- <a>标签中href="javascript:;"表示什么意思??
- 如何使用javascript向服务器提交数据(post)
- 【JS】【笔记】JavaScript入门经典(第5版)第2章 简单的脚本
- 【JS】【笔记】JavaScript入门经典(第5版)第1章 概述
- 浏览器中用JavaScript获取剪切板中的文件
- Internet Explorer 9、10、11兼容性分析处理经验谈
- JavaScript跨浏览器处理事件方法(封装成对象)
- 复习---JS-Array 对象
- Javascript异步编程的4种方法
- JS魔法堂:Data URI Scheme介绍
- JavaScript_全局函数
- JavaScript_RegExp
- Json详解
- JS变量的声明被提前到作用域顶部,赋值则保留在原地
- js 获取复选框的值
- JavaScript_Math