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 相关文章推荐
flash javascript之间的通讯方法小结
Dec 20 Javascript
麻雀虽小五脏俱全 Dojo自定义控件应用
Sep 04 Javascript
javascript写的异步加载js文件函数(支持数组传参)
Jun 07 Javascript
jQuery数组处理函数整理
Aug 03 Javascript
总结Javascript中的隐式类型转换
Aug 24 Javascript
JS简单实现移动端日历功能示例
Dec 28 Javascript
JS实现改变HTML上文字颜色和内容的方法
Dec 30 Javascript
微信小程序 本地存储及登录页面处理实例详解
Jan 11 Javascript
JavaScript创建对象方法实例小结
Sep 03 Javascript
ES6基础之展开语法(Spread syntax)
Feb 21 Javascript
jQuery实现移动端图片上传预览组件的方法分析
May 01 jQuery
JQuery Ajax如何实现注册检测用户名
Sep 25 jQuery
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
Windows下的PHP5.0详解
2006/11/18 PHP
Yii2 如何在modules中添加验证码的方法
2017/06/19 PHP
php实现session共享的实例方法
2019/09/19 PHP
Jquey拖拽控件Draggable使用方法(asp.net环境)
2010/09/28 Javascript
Javascript动态绑定事件的简单实现代码
2010/12/25 Javascript
jquery遍历筛选数组的几种方法和遍历解析json对象
2013/12/13 Javascript
捕获和分析JavaScript Error的方法
2014/03/25 Javascript
AngularJS入门教程(零):引导程序
2014/12/06 Javascript
javascript实现禁止右键和F12查看源代码
2014/12/26 Javascript
js实现网页右上角滑出会自动消失大幅广告的方法
2015/02/27 Javascript
鼠标悬停小图标显示大图标
2016/01/22 Javascript
浅谈jQuery中ajaxPrefilter的应用
2016/08/01 Javascript
node.js入门教程之querystring模块的使用方法
2017/02/27 Javascript
BootStrap TreeView使用实例详解
2017/11/01 Javascript
原生JS实现前端本地文件上传
2018/09/08 Javascript
vue+echarts实现动态绘制图表及异步加载数据的方法
2018/10/17 Javascript
详解JavaScript对数组操作(添加/删除/截取/排序/倒序)
2019/04/28 Javascript
vue中使用 pako.js 解密 gzip加密字符串的方法
2019/06/10 Javascript
VUE 直接通过JS 修改html对象的值导致没有更新到数据中解决方法分析
2019/12/02 Javascript
vue-router重写push方法,解决相同路径跳转报错问题
2020/08/07 Javascript
js+html+css实现手动轮播和自动轮播
2020/12/30 Javascript
react项目从新建到部署的实现示例
2021/02/19 Javascript
Python面向对象特殊成员
2017/04/24 Python
Python实现12306火车票抢票系统
2019/07/04 Python
Python3中urlencode和urldecode的用法详解
2019/07/23 Python
使用pandas 将DataFrame转化成dict
2019/12/10 Python
aws 通过boto3 python脚本打pach的实现方法
2020/05/10 Python
Python利用Pillow(PIL)库实现验证码图片的全过程
2020/10/04 Python
物流仓储实习自我鉴定
2013/09/25 职场文书
写演讲稿所需要注意的4个条件
2014/01/09 职场文书
中华美德颂演讲稿
2014/05/20 职场文书
2014年党风廉政建设工作总结
2014/11/19 职场文书
2015新年寄语(一句话)
2014/12/08 职场文书
2015年中职班主任工作总结
2015/05/25 职场文书
党支部考察意见范文
2015/06/02 职场文书
2016高考寄语集锦
2015/12/04 职场文书