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 相关文章推荐
Prototype使用指南之hash.js
Jan 10 Javascript
Prototype 学习 工具函数学习($方法)
Jul 12 Javascript
JavaScript构造函数详解
Dec 27 Javascript
node实现定时发送邮件的示例代码
Aug 26 Javascript
vue利用better-scroll实现轮播图与页面滚动详解
Oct 20 Javascript
深入浅析Node环境和浏览器的区别
Aug 14 Javascript
JS 实现微信扫一扫功能
Sep 14 Javascript
js如何获取图片url的Blob值并预览示例代码
Mar 07 Javascript
js图片无缝滚动插件使用详解
May 26 Javascript
微信小程序把百度地图坐标转换成腾讯地图坐标过程详解
Jul 10 Javascript
vue实现拖拽的简单案例 不超出可视区域
Jul 25 Javascript
JS实现transform实现扇子效果
Jan 17 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
Php output buffering缓存及程序缓存深入解析
2013/07/15 PHP
php+mysql结合Ajax实现点赞功能完整实例
2015/01/30 PHP
PHP调用.NET的WebService 简单实例
2015/03/27 PHP
PHP实践教程之过滤、验证、转义与密码详解
2017/07/24 PHP
PHP htmlentities()函数用法讲解
2019/02/25 PHP
laravel 中某一字段自增、自减的例子
2019/10/11 PHP
tp5.1 框架路由操作-URL生成实例分析
2020/05/26 PHP
加载jQuery后$冲突的解决办法
2010/07/09 Javascript
js 程序执行与顺序实现详解
2013/05/13 Javascript
JavaScript中Cookie操作实例
2015/01/09 Javascript
jQuery实现返回顶部效果的方法
2015/05/29 Javascript
jQuery实现的AJAX简单弹出层效果代码
2015/11/26 Javascript
JavaScript入门教程之引用类型
2016/05/04 Javascript
一步步教你利用webpack如何搭一个vue脚手架(超详细讲解和注释)
2018/01/08 Javascript
vue进行图片的预加载watch用法实例讲解
2018/02/07 Javascript
jQuery实现遍历XML节点和属性的方法示例
2018/04/29 jQuery
JavaScript中如何对多维数组(矩阵)去重的实现
2019/12/04 Javascript
JavaScript对象原型链原理解析
2020/01/22 Javascript
Vue过滤器,生命周期函数和vue-resource简单介绍
2021/01/12 Vue.js
[02:51]DOTA2 2015国际邀请赛中国区预选赛第一日战报
2015/05/27 DOTA
python生成指定长度的随机数密码
2014/01/23 Python
在Python下使用Txt2Html实现网页过滤代理的教程
2015/04/11 Python
简单介绍Python中的struct模块
2015/04/28 Python
python检测是文件还是目录的方法
2015/07/03 Python
解决Pycharm界面的子窗口不见了的问题
2019/01/17 Python
Python学习笔记之变量、自定义函数用法示例
2019/05/28 Python
python上下文管理的使用场景实例讲解
2021/03/03 Python
sort命令的作用和用法
2013/08/25 面试题
小学生红领巾广播稿
2014/01/21 职场文书
调解协议书
2014/04/16 职场文书
装修协议书范本
2014/04/21 职场文书
工会换届选举方案
2014/05/21 职场文书
考试作弊被抓检讨书
2014/10/02 职场文书
证婚人婚礼致辞
2015/07/28 职场文书
CSS3通过var()和calc()函数实现动画特效
2021/03/30 HTML / CSS
关于python3 opencv 图像二值化的问题(cv2.adaptiveThreshold函数)
2022/04/04 Python