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从头学起(基本数据类型和引用类型的参数传递详细分析)
Feb 16 Javascript
jQuery的Ajax的自动完成功能控件简要说明
Feb 22 Javascript
JS定义回车事件(实现代码)
Jul 08 Javascript
利用javascript判断文件是否存在
Dec 31 Javascript
Jquery实现的角色左右选择特效
May 21 Javascript
简单介绍jsonp 使用小结
Jan 27 Javascript
基于jQuery的网页影音播放器jPlayer的基本使用教程
Mar 08 Javascript
原生js实现百叶窗效果及原理介绍
Apr 12 Javascript
JS中的进制转换以及作用
Jun 26 Javascript
JavaScript满天星导航栏实现方法
Mar 08 Javascript
vue 之 .sync 修饰符示例详解
Apr 21 Javascript
vue实现拖拽的简单案例 不超出可视区域
Jul 25 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 编写的 25个游戏脚本
2009/05/11 PHP
PHP学习笔记之一
2011/01/17 PHP
PHP基于数组实现的分页函数实例
2014/08/20 PHP
php生成rss类用法实例
2015/04/14 PHP
php使用get_class_methods()函数获取分类的方法
2016/07/20 PHP
php实现的双色球算法示例
2017/06/20 PHP
php使用redis的有序集合zset实现延迟队列应用示例
2020/02/20 PHP
jquery图片轮播插件仿支付宝2013版全屏图片幻灯片
2014/04/03 Javascript
Javascript基础教程之数据类型转换
2015/01/18 Javascript
JavaScript File API文件上传预览
2016/02/02 Javascript
jQuery简单创建节点的方法
2016/09/09 Javascript
全新打包工具parcel零配置vue开发脚手架
2018/01/11 Javascript
react配合antd组件实现的管理系统示例代码
2018/04/24 Javascript
详解Angular5/Angular6项目如何添加热更新(HMR)功能
2018/10/10 Javascript
JavaScript判断浏览器运行环境的详细方法
2019/06/30 Javascript
js blob类型url的视频下载问题的解决
2019/11/29 Javascript
用Python脚本生成Android SALT扰码的方法
2013/09/18 Python
基于python实现微信模板消息
2015/12/21 Python
Python实现控制台进度条功能
2016/01/04 Python
python学习必备知识汇总
2017/09/08 Python
Python之自动获取公网IP的实例讲解
2017/10/01 Python
深入理解Python中的*重复运算符
2017/10/28 Python
Python cookbook(数据结构与算法)将序列分解为单独变量的方法
2018/02/13 Python
python实现SOM算法
2018/02/23 Python
浅析python中的迭代与迭代对象
2018/10/08 Python
python3 面向对象__类的内置属性与方法的实例代码
2018/11/09 Python
pandas每次多Sheet写入文件的方法
2018/12/10 Python
python中PyQuery库用法分享
2021/01/15 Python
数学与统计学院学生个人职业生涯规划书
2014/02/10 职场文书
《蜗牛》教学反思
2014/02/18 职场文书
社区居务公开实施方案
2014/03/27 职场文书
培训讲师岗位职责
2014/04/13 职场文书
酒店辞职信怎么写
2015/02/27 职场文书
超市员工辞职信范文
2015/05/12 职场文书
pytorch常用数据类型所占字节数对照表一览
2021/05/17 Python
nginx实现多geoserver服务的负载均衡
2022/05/15 Servers