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 相关文章推荐
JSON语法五大要素图文介绍
Dec 04 Javascript
为什么Node.js会这么火呢?Node.js流行的原因
Dec 01 Javascript
jQuery层级选择器用法分析
Feb 10 Javascript
js实现键盘上下左右键选择文字并显示在文本框的方法
May 07 Javascript
学习JavaScript正则表达式
Nov 13 Javascript
JavaScript判断数组重复内容的两种方法(推荐)
Jun 06 Javascript
bootstrap3 dialog 更强大、更灵活的模态框
Apr 20 Javascript
Vue实现动态显示textarea剩余字数
May 22 Javascript
vue.js实现价格格式化的方法
May 23 Javascript
Node.js利用js-xlsx处理Excel文件的方法详解
Jul 05 Javascript
vue基于better-scroll实现左右联动滑动页面
Jun 30 Javascript
VSCode 添加自定义注释的方法(附带红色警戒经典注释风格)
Aug 27 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 cron中的批处理
2008/09/16 PHP
PHP获取文件的MD5值并判断是否被修改的例子
2014/06/19 PHP
PHP中isset与array_key_exists的区别实例分析
2015/06/02 PHP
ThinkPHP5.1的权限控制怎么写?分享一个AUTH权限控制
2021/03/09 PHP
Jquery弹出窗口插件 LeanModal的使用方法
2012/03/10 Javascript
js抽奖实现随机抽奖代码效果
2013/12/02 Javascript
js给页面加style无效果的解决方法
2014/01/20 Javascript
谈谈我对JavaScript DOM事件的理解
2015/12/18 Javascript
基于JavaScript判断浏览器到底是关闭还是刷新(超准确)
2016/02/01 Javascript
BootStrap Table对前台页面表格的支持实例讲解
2016/12/22 Javascript
基于ajax与msmq技术的消息推送功能实现代码
2016/12/26 Javascript
Node.js复制文件的方法示例
2016/12/29 Javascript
Vue2 Vue-cli中使用Typescript的配置详解
2017/07/24 Javascript
vue 不使用select实现下拉框功能(推荐)
2018/05/17 Javascript
小程序实现留言板
2018/11/02 Javascript
angularjs实现table表格td单元格单击变输入框/可编辑状态示例
2019/02/21 Javascript
vue+django实现一对一聊天功能的实例代码
2019/07/17 Javascript
javascript设计模式 ? 代理模式原理与用法实例分析
2020/04/16 Javascript
jQuery实现B2B网站后台管理系统侧导航
2020/07/08 jQuery
小程序自定义圆形进度条
2020/11/17 Javascript
[02:23]完美世界全国高校联赛街访DOTA2第一期
2019/11/28 DOTA
用实例分析Python中method的参数传递过程
2015/04/02 Python
Python利用matplotlib生成图片背景及图例透明的效果
2017/04/27 Python
Python3实现转换Image图片格式
2018/06/21 Python
Python程序包的构建和发布过程示例详解
2019/06/09 Python
将自己的数据集制作成TFRecord格式教程
2020/02/17 Python
Python生成器实现简单"生产者消费者"模型代码实例
2020/03/27 Python
Python生成器next方法和send方法区别详解
2020/05/30 Python
科研先进个人典型材料
2014/01/31 职场文书
中学生期末评语
2014/02/03 职场文书
广告艺术设计专业自荐书
2014/07/08 职场文书
2015年清明节活动总结
2015/02/09 职场文书
公司开除员工通知
2015/04/22 职场文书
就业意向书范本
2015/05/11 职场文书
如何利用JavaScript实现二叉搜索树
2021/04/02 Javascript
SpringBoot 集成Redis 过程
2021/06/02 Redis