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 相关文章推荐
jquery 按钮状态效果 正常、移上、按下
Aug 12 Javascript
JS实现一键回顶功能示例代码
Oct 28 Javascript
jquery validate添加自定义验证规则(验证邮箱 邮政编码)
Dec 04 Javascript
静态页面html中跳转传值的JS处理技巧
Jun 22 Javascript
jQuery弹出下拉列表插件(实现kindeditor的@功能)
Aug 16 Javascript
JavaScript基于DOM操作实现简单的数学运算功能示例
Jan 16 Javascript
JavaScript和jQuery制作光棒效果
Feb 24 Javascript
vue如何解决循环引用组件报错的问题
Sep 22 Javascript
Vue利用History记录上一页面的数据方法实例
Nov 02 Javascript
vue-cli 3.0 版本与3.0以下版本在搭建项目时的区别详解
Dec 11 Javascript
JS常见内存泄漏及解决方案解析
May 30 Javascript
jquery插件实现图片悬浮
Apr 16 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
PHP分多步骤填写发布信息的简单方法实例代码
2012/09/23 PHP
php去除换行符的方法小结(PHP_EOL变量的使用)
2013/02/16 PHP
分享PHP计算两个日期相差天数的代码
2015/12/23 PHP
Thinkphp 框架扩展之标签库驱动原理与用法分析
2020/04/23 PHP
JavaScript 使用技巧精萃(.net html
2009/04/25 Javascript
JS 新增Cookie 取cookie值 删除cookie 举例详解
2014/10/10 Javascript
用JavaScript实现PHP的urlencode与urldecode函数
2015/08/13 Javascript
JS实现的自定义网页拖动类
2015/11/06 Javascript
AngularJs实现ng1.3+表单验证
2015/12/10 Javascript
JavaScript获取图片像素颜色并转换为box-shadow显示
2016/03/11 Javascript
JQuery对ASP.NET MVC数据进行更新删除
2016/07/13 Javascript
详解angular中如何监控dom渲染完毕
2017/01/03 Javascript
JS中绑定事件顺序(事件冒泡与事件捕获区别)
2017/01/24 Javascript
vue语法之拼接字符串的示例代码
2017/10/25 Javascript
Vue实现根据hash高亮选项卡
2019/05/27 Javascript
json 带斜杠时如何解析的实现
2019/08/12 Javascript
js实现轮播图效果 z-index实现轮播图
2020/01/17 Javascript
布同自制Python函数帮助查询小工具
2011/03/13 Python
python中pycurl库的用法实例
2014/09/30 Python
Python下的subprocess模块的入门指引
2015/04/16 Python
在Python中使用sort()方法进行排序的简单教程
2015/05/21 Python
python实现ping的方法
2015/07/06 Python
Python定时器实例代码
2017/11/01 Python
基于python实现KNN分类算法
2020/04/23 Python
使用python绘制cdf的多种实现方法
2020/02/25 Python
python GUI框架pyqt5 对图片进行流式布局的方法(瀑布流flowlayout)
2020/03/12 Python
Python Scrapy多页数据爬取实现过程解析
2020/06/12 Python
python中四舍五入的正确打开方式
2021/01/18 Python
利用 Canvas实现绘画一个未闭合的带进度条的圆环
2019/07/26 HTML / CSS
数据库方面面试题
2012/04/22 面试题
家长会演讲稿范文
2014/01/10 职场文书
一份创业计划书范文
2014/02/08 职场文书
大队委竞选演讲稿
2014/04/28 职场文书
Golang 编译成DLL文件的操作
2021/05/06 Golang
详解Spring Security中的HttpBasic登录验证模式
2022/03/17 Java/Android
不负正版帝国之名 《重返帝国》引领SLG手游制作新的标杆
2022/04/07 其他游戏