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 相关文章推荐
javascript 异步页面查询实现代码(asp.net)
May 26 Javascript
鼠标右击事件代码(asp.net后台)
Jan 27 Javascript
Jquery遍历checkbox获取选中项value值的方法
Feb 13 Javascript
jquery使用正则表达式验证email地址的方法
Jan 22 Javascript
深入理解JavaScript系列(30):设计模式之外观模式详解
Mar 03 Javascript
BootStrap智能表单实战系列(三)分块表单配置详解
Jun 13 Javascript
JavaScript基于原型链的继承
Jun 22 Javascript
Vue组件之极简的地址选择器的实现
May 31 Javascript
AngularJS与后端php的数据交互方法
Aug 13 Javascript
解决vue-router在同一个路由下切换,取不到变化的路由参数问题
Sep 01 Javascript
基于JavaScript实现简单抽奖功能代码实例
Oct 20 Javascript
Antd表格滚动 宽度自适应 不换行的实例
Oct 27 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
有关phpmailer的详细介绍及使用方法
2013/01/28 PHP
windows环境下php配置memcache的具体操作步骤
2013/06/09 PHP
php+curl 发送图片处理代码分享
2015/07/09 PHP
详谈php静态方法及普通方法的区别
2016/10/04 PHP
PHP基于接口技术实现简单的多态应用完整实例
2017/04/26 PHP
Laravel中log无法写入问题的解决
2017/06/17 PHP
解析js如何获取当前url中的参数值并复制给input
2013/06/23 Javascript
JavaScript AJAX之惰性载入函数
2014/08/27 Javascript
JavaScript原生对象之Date对象的属性和方法详解
2015/03/13 Javascript
深入理解JavaScript的React框架的原理
2015/07/02 Javascript
基于jQuery实现多标签页切换的效果(web前端开发)
2016/07/24 Javascript
JS正则表达式修饰符中multiline(/m)用法分析
2016/12/27 Javascript
Angularjs 依赖压缩及自定义过滤器写法
2017/02/04 Javascript
基于vue2.0+vuex+localStorage开发的本地记事本示例
2017/02/28 Javascript
详解vue中axios的封装
2018/07/18 Javascript
微信小程序发布新版本时自动提示用户更新的方法
2019/06/07 Javascript
Nodejs实现WebSocket代码实例
2020/05/19 NodeJs
Vue按时间段查询数据组件使用详解
2020/08/21 Javascript
[44:40]2018DOTA2亚洲邀请赛3月30日 小组赛A组Liquid VS OG
2018/03/31 DOTA
用十张图详解TensorFlow数据读取机制(附代码)
2018/02/06 Python
python正则表达式之对号入座篇
2018/07/24 Python
python3 打印输出字典中特定的某个key的方法示例
2019/07/06 Python
python+openCV调用摄像头拍摄和处理图片的实现
2019/08/06 Python
Python3显示当前时间、计算时间差及时间加减法示例代码
2019/09/07 Python
浅谈Django中的QueryDict元素为数组的坑
2020/03/31 Python
鱼油专家:Omegavia
2016/10/10 全球购物
Hotter Shoes英国官网:英伦风格,舒适的鞋子
2017/12/28 全球购物
eBay澳大利亚站:eBay.com.au
2018/02/02 全球购物
波兰家具和室内装饰品购物网站:Vivre
2018/04/10 全球购物
教师考察材料范文
2014/06/03 职场文书
政治学专业毕业生求职信
2014/08/11 职场文书
财务工作犯错检讨书
2014/10/07 职场文书
整改落实自查报告
2014/11/05 职场文书
2014年组织部工作总结
2014/11/14 职场文书
储备店长岗位职责
2015/04/14 职场文书
如何用PHP实现多线程编程
2021/05/26 PHP