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 StringBuilder类实现
Dec 22 Javascript
使用JavaScript脚本判断页面是否在微信中被打开
Mar 06 Javascript
JSONP和批量操作功能的实现方法
Aug 21 Javascript
jQuery监听文件上传实现进度条效果的方法
Oct 16 Javascript
vue.js指令v-for使用及索引获取
Nov 03 Javascript
JavaScript实现多栏目切换效果
Dec 12 Javascript
js+html制作简单验证码
Feb 16 Javascript
jquery拼接ajax 的json和字符串拼接的方法
Mar 11 Javascript
Vue.js实现一个SPA登录页面的过程【推荐】
Apr 29 Javascript
Vue.js简易安装和快速入门(第二课)
Oct 17 Javascript
通过vue-cli3构建一个SSR应用程序的方法
Sep 13 Javascript
vue.js this.$router.push获取不到params参数问题
Mar 03 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 UNIX时间戳用法详解
2017/02/16 PHP
详解cookie验证的php应用的一种SSO解决办法
2017/10/20 PHP
JavaScript Array扩展实现代码
2009/10/14 Javascript
浏览器脚本兼容 文本框中,回车键触发事件的兼容
2010/06/21 Javascript
网页前端优化之滚动延时加载图片示例
2013/07/13 Javascript
JS中的构造函数详细解析
2014/03/10 Javascript
深入理解javascript变量声明
2014/11/20 Javascript
jQuery1.9.1源码分析系列(十六)ajax之ajax框架
2015/12/04 Javascript
常用的9个JavaScript图表库详解
2017/12/19 Javascript
Vue中"This dependency was not found"问题的解决方法
2018/06/19 Javascript
JS函数内部属性之arguments和this实例解析
2018/10/07 Javascript
vue.js实现的幻灯片功能示例
2019/01/18 Javascript
Typescript的三种运行方式(小结)
2019/09/18 Javascript
JavaScript中的类型检查
2020/02/03 Javascript
python使用wxPython打开并播放wav文件的方法
2015/04/24 Python
python使用fork实现守护进程的方法
2017/11/16 Python
Python标准库shutil用法实例详解
2018/08/13 Python
python3.7.0的安装步骤
2018/08/27 Python
Python根据欧拉角求旋转矩阵的实例
2019/01/28 Python
ActiveMQ:使用Python访问ActiveMQ的方法
2019/01/30 Python
简单了解python的break、continue、pass
2019/07/08 Python
face++与python实现人脸识别签到(考勤)功能
2019/08/28 Python
Python 限定函数参数的类型及默认值方式
2019/12/24 Python
Kate Spade美国官网:纽约新兴时尚品牌,以包包闻名于世
2017/11/09 全球购物
Myprotein加拿大官网:欧洲第一的运动营养品牌
2018/01/06 全球购物
Java如何调用外部Exe程序
2015/07/04 面试题
最新英语专业学生求职信范文
2013/09/21 职场文书
幼儿园家长会邀请函
2014/01/15 职场文书
《浅水洼里的小鱼》听课反思
2014/02/28 职场文书
2014司机年终工作总结
2014/12/05 职场文书
毕业生就业推荐表导师评语
2014/12/31 职场文书
地球上的星星观后感
2015/06/02 职场文书
辛德勒的名单观后感
2015/06/03 职场文书
2015初中团支部工作总结
2015/07/21 职场文书
安全生产会议制度
2015/08/06 职场文书
公文格式,规则明细(新手收藏)
2019/07/23 职场文书