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自定义的函数
Aug 05 Javascript
始终在屏幕中间显示Div的代码(css+js)
Mar 10 Javascript
js获取系统的根路径实现介绍
Sep 08 Javascript
jquery跟js初始化加载的多种方法及区别介绍
Apr 02 Javascript
jQuery插件开发的五种形态小结
Mar 04 Javascript
jQuery常见的选择器及用法介绍
Dec 20 Javascript
AngularJs表单校验功能实例代码
Feb 09 Javascript
浅析Angular2子模块以及异步加载
Apr 24 Javascript
如何使node也支持从url加载一个module详解
Jun 05 Javascript
解决VUE中document.body.scrollTop为0的问题
Sep 15 Javascript
在vue-cli中引入lodash.js并使用详解
Nov 13 Javascript
小程序跨页面交互的作用与方法详解
Jan 07 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
echo, print, printf 和 sprintf 区别
2006/12/06 PHP
PHP 批量更新网页内容实现代码
2010/01/05 PHP
PHP提示Notice: Undefined variable的解决办法
2012/11/24 PHP
php中序列化与反序列化详解
2017/02/13 PHP
JavaScript 学习笔记(五)
2009/12/31 Javascript
Firefox和IE兼容性问题及解决方法总结
2013/10/08 Javascript
JavaScript对象之深度克隆介绍
2014/12/08 Javascript
高性能JavaScript DOM编程(1)
2015/08/11 Javascript
Nginx上传文件全部缓存解决方案
2015/08/17 Javascript
实现非常简单的js双向数据绑定
2015/11/06 Javascript
4种JavaScript实现简单tab选项卡切换的方法
2016/01/06 Javascript
jQuery调用WebMethod(PageMethod) NET2.0的方法
2016/04/15 Javascript
基于JS模仿windows文件按名称排序效果
2016/06/29 Javascript
AngularJS内建服务$location及其功能详解
2016/07/01 Javascript
基于BootStrap环境写jQuery tabs插件
2016/07/12 Javascript
浅析bootstrap原理及优缺点
2017/03/19 Javascript
JavaScript数据结构之二叉树的查找算法示例
2017/04/13 Javascript
jQuery实现的文字逐行向上间歇滚动效果示例
2017/09/06 jQuery
浅谈angular2路由预加载策略
2017/10/04 Javascript
浅谈JsonObject中的key-value数据解析排序问题
2017/12/06 Javascript
用图片替换checkbox原始样式并实现同样的功能
2018/11/15 Javascript
[01:27:43]VGJ.S vs TNC Supermajor 败者组 BO3 第三场 6.6
2018/06/07 DOTA
Python中列表、字典、元组数据结构的简单学习笔记
2016/03/20 Python
pygame 精灵的行走及二段跳的实现方法(必看篇)
2017/07/10 Python
将python代码和注释分离的方法
2018/04/21 Python
PyTorch中反卷积的用法详解
2019/12/30 Python
python实现批量命名照片
2020/06/18 Python
利用Python pandas对Excel进行合并的方法示例
2020/11/04 Python
用html5的canvas和JavaScript创建一个绘图程序的简单实例
2016/07/06 HTML / CSS
土耳其时尚潮流在线购物网站:Trendyol
2017/10/10 全球购物
广州一家公司的.NET面试题
2016/06/11 面试题
机关驾驶员违规检讨书
2014/09/13 职场文书
刑事辩护授权委托书
2014/09/13 职场文书
简单租房协议书(范本)
2014/10/13 职场文书
电工实训报告总结
2014/11/05 职场文书
MySQL GRANT用户授权的实现
2021/06/18 MySQL