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 火狐(firefox)不显示本地图片问题解决
Jul 05 Javascript
JavaScript面向对象之Prototypes和继承
Jul 12 Javascript
js代码实现下拉菜单【推荐】
Dec 15 Javascript
微信小程序(六):列表上拉加载下拉刷新示例
Jan 13 Javascript
js中开关变量使用实例
Feb 24 Javascript
jQuery tip提示插件(实例分享)
Apr 28 jQuery
vue组件实现弹出框点击显示隐藏效果
Oct 26 Javascript
基于ionic实现下拉刷新功能
May 10 Javascript
Vue.set 全局操作简单示例
Sep 19 Javascript
使用Vue生成动态表单
Nov 26 Javascript
vue el-upload上传文件的示例代码
Dec 21 Vue.js
element-ui封装一个Table模板组件的示例
Jan 04 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
一个用php3编写的简单计数器
2006/10/09 PHP
PHP与MySQL开发中页面乱码的产生与解决
2008/03/27 PHP
php下几个常用的去空、分组、调试数组函数
2009/02/22 PHP
用来解析.htgroup文件的PHP类
2012/09/05 PHP
thinkphp实现163、QQ邮箱收发邮件的方法
2015/12/18 PHP
简单了解将WordPress中的工具栏移到底部的小技巧
2015/12/31 PHP
laravel 根据不同组织加载不同视图的实现
2019/10/14 PHP
jQuery 使用手册(一)
2009/09/23 Javascript
window.requestAnimationFrame是什么意思,怎么用
2013/01/13 Javascript
深入理解JavaScript中的传值与传引用
2013/12/09 Javascript
使用JQuery快速实现Tab的AJAX动态载入(实例讲解)
2013/12/11 Javascript
javascript面向对象之定义成员方法实例分析
2015/01/13 Javascript
JavaScript获得页面base标签中url的方法
2015/04/03 Javascript
js实现同一页面多个运动效果的方法
2015/04/10 Javascript
JS实现横向拉伸动感伸缩菜单效果代码
2015/09/04 Javascript
vue axios数据请求get、post方法及实例详解
2018/09/11 Javascript
微信小程序template模版的使用方法
2019/04/13 Javascript
vue.js多页面开发环境搭建过程
2019/04/24 Javascript
egg.js的基本使用和调用数据库的方法示例
2019/05/18 Javascript
在vue项目中使用codemirror插件实现代码编辑器功能
2019/08/27 Javascript
python实现2048小游戏
2015/03/30 Python
Python中字符串的常见操作技巧总结
2016/07/28 Python
python opencv设置摄像头分辨率以及各个参数的方法
2018/04/02 Python
基于python list对象中嵌套元组使用sort时的排序方法
2018/04/18 Python
Python实现的质因式分解算法示例
2018/05/03 Python
使用sklearn进行对数据标准化、归一化以及将数据还原的方法
2018/07/11 Python
有趣的Python图片制作之如何用QQ好友头像拼接出里昂
2020/04/22 Python
基于django和dropzone.js实现上传文件
2020/11/24 Python
html5中localStorage本地存储的简单使用
2017/06/16 HTML / CSS
eDreams澳大利亚:预订机票、酒店和度假产品
2017/04/19 全球购物
地球上最先进的胡子和头发修剪器:Bevel
2018/01/23 全球购物
《雾凇》教学反思
2014/02/17 职场文书
课外访万家心得体会
2014/09/03 职场文书
2015年上半年信访工作总结
2015/03/30 职场文书
奠基仪式致辞
2015/07/30 职场文书
远程教育培训心得体会
2016/01/09 职场文书