Eval and new funciton not the same thing


Posted in Javascript onDecember 27, 2012

1、函数声明式

function foo(){ 
//code 
}

在JS中,函数也是对象,函数对象连接到Function.prototype( Function.prototype连接到Object.prototype)
2、函数字面量式
var foo = function foo(){ 
//code 
}

对象拥有一个连到原型对象的隐藏连接。对象字面量间生的对象连接到Object.prototype。 foo.__proto__ == Function.prototype
3、使用New的构造函数生成

new Function ([arg1[, arg2[, ... argN]],] functionBody);

每次执行都生成新的函数
网上的资料有很多介绍这三种模式的,前2种几乎是相同的,基于相同的词法作用域。

词法作用域:变量的作用域是在定义时决定而不是执行时决定,也就是说词法作用域取决于源码,通过静态分析就能确定,因此词法作用域也叫做静态作用域。 with和eval除外,所以只能说JS的作用域机制非常接近词法作用域(Lexical scope)。
突然感觉有点离题了,这篇文章其实是记录eval和New Function的区别,下面回归正题:

以前有人会说,new Function的方式是几乎与eval相等,今天我查了一下,确实是不同的东西,说这句话的人太不负责了。关于eval和new function,得到的结果都是一致的,都会叫你不要去使用它们。所以结论就是“不得不”才使用。

eval() evaluates a string as a JavaScript expression within the current execution scope and can access local variables.
new Function()parses the JavaScript code stored in a string into a function object, which can then be called. It cannot access local variables because the code runs in a separate scope.
从以上2点看出,eval的作用域是现行的作用域,而new Function是动态生成的,它的作用域始终都是window。并且,eval可以读到本地的变量,new Function则不能。

function test() { 
var a = 11; 
eval('(a = 22)'); //如果是new Function('return (a = 22);')(); a的值是不会覆盖的。 
alert(a); // alerts 22 
}

所以一般eval只用于转换JSON对象,new Function也有特殊的用途,只是在不清楚的情况下还是少用为妙。

更多资料:邪恶的eval和new Function

这里作个备份:

代码:

// 友善提醒:为了你的手指安全,请在Chrome下运行 
'alert("hello")'.replace(/.+/, eval); 
'alert("hello")'.replace(/.+/, function(m){new Function(m)();}); var i = 0; eval(new Array(101).join('alert(++i);')); 
var i = 0; new Function(new Array(101).join('alert(++i);'))();
Javascript 相关文章推荐
处理文本部分内容的TextRange对象应用实例
Jul 29 Javascript
Windows系统下Node.js的简单入门教程
Jun 23 Javascript
JQuery和PHP结合实现动态进度条上传显示
Nov 23 Javascript
微信小程序 转发功能的实现
Aug 04 Javascript
node.js-v6新版安装具体步骤(分享)
Sep 06 Javascript
js的函数的按值传递参数(实例讲解)
Nov 16 Javascript
基于webpack4搭建的react项目框架的方法
Jun 30 Javascript
vue脚手架搭建项目的兼容性配置详解
Jul 17 Javascript
vue写h5页面的方法总结
Feb 12 Javascript
layui使用button按钮 点击出现弹层 弹层中加载表单的实例
Sep 04 Javascript
vue 使用高德地图vue-amap组件过程解析
Sep 07 Javascript
在VUE中使用lodash的debounce和throttle操作
Nov 09 Javascript
Javascript图像处理—虚拟边缘介绍及使用方法
Dec 27 #Javascript
JS 添加网页桌面快捷方式的代码详细整理
Dec 27 #Javascript
JavaScript初学者应注意的七个细节详细介绍
Dec 27 #Javascript
圣诞节Merry Christmas给博客添加浪漫的下雪效果基于jquery实现
Dec 27 #Javascript
js/ajax跨越访问-jsonp的原理和实例(javascript和jquery实现代码)
Dec 27 #Javascript
关于火狐(firefox)及ie下event获取的两种方法
Dec 27 #Javascript
Javascript图像处理—为矩阵添加常用方法
Dec 27 #Javascript
You might like
基于mysql的论坛(7)
2006/10/09 PHP
php unset全局变量运用问题的深入解析
2013/06/17 PHP
基于PHP magic_quotes_gpc的使用方法详解
2013/06/24 PHP
ThinkPHP进程计数类Process用法实例详解
2015/09/25 PHP
javascript改变position值实现菜单滚动至顶部后固定
2013/01/18 Javascript
原生js ActiveXObject获取execl里面的值
2013/11/01 Javascript
addEventListener 的用法示例介绍
2014/05/07 Javascript
兼容主流浏览器的JS复制内容到剪贴板
2014/12/12 Javascript
jQuery文字横向滚动效果的实现代码
2016/05/31 Javascript
微信小程序 参数传递详解
2016/10/24 Javascript
借助node实战JSONP跨域实例
2017/03/30 Javascript
React学习笔记之条件渲染(一)
2017/07/02 Javascript
React如何将组件渲染到指定DOM节点详解
2017/09/08 Javascript
javaScript实现滚动条事件详解
2020/03/24 Javascript
angular json对象push到数组中的方法
2018/02/27 Javascript
JavaScript中import用法总结
2019/01/20 Javascript
vue.js路由mode配置之去掉url上默认的#方法
2019/11/01 Javascript
[19:24]DOTA2客户端使用指南 一分钟快速设置轻松超神
2013/09/24 DOTA
python实现socket端口重定向示例
2014/02/10 Python
go语言计算两个时间的时间差方法
2015/03/13 Python
python 打印对象的所有属性值的方法
2016/09/11 Python
Python判断两个对象相等的原理
2017/12/12 Python
详解python使用递归、尾递归、循环三种方式实现斐波那契数列
2018/01/16 Python
在Python中获取两数相除的商和余数方法
2018/11/10 Python
python实现给scatter设置颜色渐变条colorbar的方法
2018/12/13 Python
python 矢量数据转栅格数据代码实例
2019/09/30 Python
巴西手表购物网站:eclock
2019/03/19 全球购物
PHP如何调用MYSQL存储过程
2014/05/30 面试题
如何在存储过程中使用Loop
2016/01/05 面试题
《李广射虎》教学反思
2014/04/27 职场文书
文明美德伴我成长演讲稿
2014/05/12 职场文书
大学生工作求职信
2014/06/23 职场文书
领导干部学习“三严三实”思想汇报
2014/09/15 职场文书
2014年重阳节敬老活动方案
2014/09/16 职场文书
奖学金个人总结
2015/03/04 职场文书
少先队入队仪式主持词
2015/07/04 职场文书