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与asp.net(c#)互相调用方法
Dec 13 Javascript
jQuery实现获取绑定自定义事件元素的方法
Dec 02 Javascript
JavaScript:Date类型全面解析
May 19 Javascript
js获取对象、数组的实际长度,元素实际个数的实现代码
Jun 08 Javascript
JS+HTML5 FileReader对象用法示例
Apr 07 Javascript
angular 基于ng-messages的表单验证实例
May 04 Javascript
ES6入门教程之Class和Module详解
May 17 Javascript
Node.js 的模块知识汇总
Aug 16 Javascript
快速解决Vue项目在IE浏览器中显示空白的问题
Sep 04 Javascript
Vue事件处理原理及过程详解
Mar 11 Javascript
Vue实现Header渐隐渐现效果的实例代码
Nov 05 Javascript
vue封装数字翻牌器
Apr 20 Vue.js
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设计模式 Factory(工厂模式)
2011/06/26 PHP
PHP中怎样防止SQL注入分析
2014/10/23 PHP
修改WordPress中文章编辑器的样式的方法详解
2015/12/15 PHP
PHP中array_keys和array_unique函数源码的分析
2016/02/26 PHP
PHP中用mysqli面向对象打开连接关闭mysql数据库的方法
2016/11/05 PHP
CodeIgniter整合Smarty的方法详解
2017/08/25 PHP
jquery控制listbox中项的移动并排序
2009/11/12 Javascript
javascript 构造函数方式定义对象
2015/01/02 Javascript
jquery实现图片上传前本地预览功能
2016/05/10 Javascript
javascript css红色经典选项卡效果实现代码
2016/05/17 Javascript
JS调用某段SQL语句的方法
2016/10/20 Javascript
在html中引入外部js文件,并调用带参函数的方法
2016/10/31 Javascript
JavaScript基础——使用Canvas绘图
2016/11/02 Javascript
jQuery插件Echarts实现的渐变色柱状图
2017/03/23 jQuery
javascript实现延时显示提示框效果
2017/06/01 Javascript
微信小程序模板(template)使用详解
2018/01/31 Javascript
基于 vue-skeleton-webpack-plugin 的骨架屏实战
2019/08/05 Javascript
axios实现简单文件上传功能
2019/09/25 Javascript
Vue axios获取token临时令牌封装案例
2020/09/11 Javascript
vue集成openlayers加载geojson并实现点击弹窗教程
2020/09/24 Javascript
用Python的urllib库提交WEB表单
2009/02/24 Python
python命令行参数解析OptionParser类用法实例
2014/10/09 Python
Python中执行存储过程及获取存储过程返回值的方法
2017/10/07 Python
python实现kNN算法
2017/12/20 Python
django 开发忘记密码通过邮箱找回功能示例
2018/04/17 Python
pandas DataFrame 删除重复的行的实现方法
2019/01/29 Python
详解Python3注释知识点
2019/02/19 Python
python中的函数递归和迭代原理解析
2019/11/14 Python
python二元表达式用法
2019/12/04 Python
美国波西米亚风格服装品牌:Show Me Your Mumu
2018/01/05 全球购物
澳大利亚男士西服品牌:M.J.Bale
2018/02/06 全球购物
食品业务员岗位职责
2014/03/18 职场文书
分公司负责人任命书
2014/06/04 职场文书
2014年助理工程师工作总结
2014/11/14 职场文书
php 获取音视频时长,PHP 利用getid3 获取音频文件时长等数据
2021/04/01 PHP
Python中的turtle画箭头,矩形,五角星
2022/03/16 Python