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 相关文章推荐
js用图作提交按钮或超连接
Mar 26 Javascript
jQuery EasyUI API 中文文档 - ValidateBox验证框
Oct 06 Javascript
深入理解JavaScript系列(2) 揭秘命名函数表达式
Jan 15 Javascript
精心挑选的15个jQuery下拉菜单制作教程
Jun 15 Javascript
JavaScript fontsize方法入门实例(按照指定的尺寸来显示字符串)
Oct 17 Javascript
director.js实现前端路由使用实例
Feb 03 Javascript
jQuery+HTML5实现图片上传前预览效果
Aug 20 Javascript
详解js私有作用域中创建特权方法
Jan 25 Javascript
微信小程序中子页面向父页面传值实例详解
Mar 20 Javascript
Vue.js实战之组件的进阶
Apr 04 Javascript
JS实现经典的中国地区三级联动下拉菜单功能实例【测试可用】
Jun 06 Javascript
angular1.x ui-route传参的三种写法小结
Aug 31 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
基于文本的留言簿
2006/10/09 PHP
php正则替换处理HTML页面的方法
2015/06/17 PHP
PHP版QQ互联OAuth示例代码分享
2015/07/05 PHP
php防止CC攻击代码 php防止网页频繁刷新
2015/12/21 PHP
yii2使用GridView实现数据全选及批量删除按钮示例
2017/03/01 PHP
wordpress网站转移到本地运行测试的方法
2017/03/15 PHP
jQuery UI Dialog控件中的表单无法正常提交的解决方法
2010/12/19 Javascript
JavaScript调用ajax获取文本文件内容实现代码
2014/03/28 Javascript
jQuery切换网页皮肤并保存到Cookie示例代码
2014/06/16 Javascript
angularJS 中input示例分享
2015/02/09 Javascript
Javascript调用函数方法的几种方式介绍
2015/03/20 Javascript
js实现漂浮回顶部按钮实例
2015/05/06 Javascript
js实现iPhone界面风格的单选框和复选框按钮实例
2015/08/18 Javascript
JavaScript+html5 canvas实现图片破碎重组动画特效
2016/02/22 Javascript
jQuery实现自动输入email、时间和域名的方法
2016/08/24 Javascript
AngularJs 国际化(I18n/L10n)详解
2016/09/01 Javascript
用js控件div的滚动条,让它在内容更新时自动滚到底部的实现方法
2016/10/27 Javascript
JS去掉字符串末尾的标点符号及删除最后一个字符的方法
2017/10/24 Javascript
vue实现自定义日期组件功能的实例代码
2018/11/06 Javascript
VueCli3构建TS项目的方法步骤
2018/11/07 Javascript
小程序实现悬浮搜索框
2019/07/12 Javascript
JavaScript面向对象中接口实现方法详解
2019/07/24 Javascript
原生js基于canvas实现一个简单的前端截图工具代码实例
2019/09/10 Javascript
openlayers实现地图弹窗
2020/09/25 Javascript
elementUI同一页面展示多个Dialog的实现
2020/11/19 Javascript
Sanic框架请求与响应实例分析
2018/07/16 Python
pygame游戏之旅 按钮上添加文字的方法
2018/11/21 Python
python代码 输入数字使其反向输出的方法
2018/12/22 Python
python rsa实现数据加密和解密、签名加密和验签功能
2019/09/18 Python
django实现模板中的字符串文字和自动转义
2020/03/31 Python
利用pyecharts读取csv并进行数据统计可视化的实现
2020/04/17 Python
Python数据可视化图实现过程详解
2020/06/12 Python
销售员岗位职责
2014/06/09 职场文书
查摆问题自查报告范文
2014/10/13 职场文书
公司内部升职自荐信
2015/03/27 职场文书
Nginx如何限制IP访问只允许特定域名访问
2022/07/23 Servers