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 相关文章推荐
aspx中利用js实现确认删除代码
Jul 22 Javascript
jquery中post方法用法实例
Oct 21 Javascript
jQuery简单几行代码实现tab切换
Mar 10 Javascript
浅谈node.js中async异步编程
Oct 22 Javascript
实例讲解Jquery中隐藏hide、显示show、切换toggle的用法
May 13 Javascript
jQuery按需加载轮播图(web前端性能优化)
Feb 17 Javascript
Node.js 异步异常的处理与domain模块解析
May 10 Javascript
JS实现点击Radio动态更新table数据
Jul 18 Javascript
vue+axios+element ui 实现全局loading加载示例
Sep 11 Javascript
解决 window.onload 被覆盖的问题方法
Jan 14 Javascript
jquery实现简单自动轮播图效果
Jul 29 jQuery
AudioContext 实现音频可视化(web技术分享)
Feb 24 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
Linux下CoreSeek及PHP扩展模块的安装
2012/09/23 PHP
如何使用PHP Embed SAPI实现Opcodes查看器
2015/11/10 PHP
js的表单操作 简单计算器
2011/12/29 Javascript
Prototype源码浅析 String部分(二)
2012/01/16 Javascript
JavaScript实现快速排序的方法
2015/07/31 Javascript
使用JS代码实现点击按钮下载文件
2016/11/12 Javascript
JS查找数组中重复元素的方法详解
2017/06/14 Javascript
bootstrap datepicker插件默认英文修改为中文
2017/07/28 Javascript
webpack写jquery插件的环境配置
2017/12/21 jQuery
React Native基础入门之初步使用Flexbox布局
2018/07/02 Javascript
JQuery扩展对象方法操作示例
2018/08/21 jQuery
Vue中控制v-for循环次数的实现方法
2018/09/26 Javascript
javascript数组去重方法总结(推荐)
2019/03/20 Javascript
微信小程序使用echarts获取数据并生成折线图
2019/10/16 Javascript
Node.js API详解之 os模块用法实例分析
2020/05/06 Javascript
[05:03]显微镜下的DOTA2第十期——Ti3豪之超神幽鬼
2014/06/23 DOTA
[01:21]DOTA2 新英雄 森海飞霞
2020/12/18 DOTA
python搭建简易服务器分析与实现
2012/12/15 Python
Python函数的周期性执行实现方法
2016/08/13 Python
Python遍历文件夹和读写文件的实现方法
2017/05/10 Python
Python3之手动创建迭代器的实例代码
2019/05/22 Python
python循环定时中断执行某一段程序的实例
2019/06/29 Python
python语言线程标准库threading.local解读总结
2019/11/10 Python
PyQt5 QDockWidget控件应用详解
2020/08/12 Python
CSS3 3D制作实战案例分析
2016/09/18 HTML / CSS
一款纯css3实现的竖形二级导航的实例教程
2014/12/11 HTML / CSS
英格兰橄榄球商店:England Rugby Store
2016/12/17 全球购物
final, finally, finalize的区别
2012/03/01 面试题
毕业生自荐书
2013/12/18 职场文书
省三好学生申请材料
2014/01/22 职场文书
宣传策划类求职信范文
2014/01/31 职场文书
商务日语专业毕业生自荐信
2014/03/27 职场文书
关爱老人标语
2014/06/21 职场文书
党支部反对四风思想汇报
2014/10/10 职场文书
2015年学校团委工作总结
2015/05/26 职场文书
python xlwt模块的使用解析
2021/04/13 Python