Eval and new funciton not the same thing

 更新时间:2012年12月27日 15:32:22   作者:  
以前有人会说,new Function的方式是几乎与eval相等,今天我查了一下,确实是不同的东西,说这句话的人太不负责了。关于eval和new function,得到的结果都是一致的,都会叫你不要去使用它们。所以结论就是“不得不”才使用
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);'))();

相关文章

  • 解决window.open()被浏览器拦截的问题

    解决window.open()被浏览器拦截的问题

    这篇文章介绍了window.open()被浏览器拦截的解决方法,文中通过示例代码介绍的非常详细。对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-06-06
  • AngularJs中Bootstrap3 datetimepicker使用实例

    AngularJs中Bootstrap3 datetimepicker使用实例

    这篇文章主要为大家详细介绍了AngularJs中Bootstrap3 datetimepicker使用实例,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2016-12-12
  • javascript css在IE和Firefox中区别分析

    javascript css在IE和Firefox中区别分析

    我们讨论的主题CSS网页布局,最令大家头疼的问题就是浏览器兼容性,虽然52CSS.com介绍过很多这方向的知识,但依然让很多开发人员晕头转向,今天的这篇文章,将列出css和javascript在IE和Firefox中二十三个不同点,希望对大家的学习有所帮助。
    2009-02-02
  • javascript之通用简单的table选项卡实现(二)

    javascript之通用简单的table选项卡实现(二)

    上篇中的选项卡存在这样的问题:把逻辑封装在table.js中,不够灵活,也就是说如果某个选项卡是实现异步请求或者跳转,而非div的显隐切换,那么就得修过table.js来达到目的,显然不是我所需要的。
    2010-05-05
  • js中如何把字符串转化为对象、数组示例代码

    js中如何把字符串转化为对象、数组示例代码

    在本文为大家介绍下把字符串转化为对象:把文本转化为对象、把文本转化为数组,具体实现如下,感兴趣的朋友可以参考下哈,希望对大家有所帮助
    2013-07-07
  • 多个js与css文件的合并方法详细说明

    多个js与css文件的合并方法详细说明

    在Web项目的开发中,js,css文件会随着项目的开发变得越来越多,越来越大,这就给给性能方面带来一些问题;解决该问题的一个好的方法就是合并js,css文件需要了解的朋友可以参考下
    2012-12-12
  • JS实现简单省市二级联动

    JS实现简单省市二级联动

    这篇文章主要为大家详细介绍了JS实现简单的省市二级联动,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-11-11
  • JavaScript中的class类详解

    JavaScript中的class类详解

    JavaScript 中的类(Class)是一种新的语言特性,它让我们可以使用面向对象编程的思想来更加方便地组织和管理代码。在本文中,我们将详细介绍 JavaScript 中的类特性,感兴趣的同学可以借鉴阅读
    2023-05-05
  • JS实现的Unicode编码转换操作示例

    JS实现的Unicode编码转换操作示例

    这篇文章主要介绍了JS实现的Unicode编码转换操作,结合完整实例形式分析了javascript实现Unicode编码转换的具体操作技巧,需要的朋友可以参考下
    2017-04-04
  • JavaScript判断微信浏览器实例代码

    JavaScript判断微信浏览器实例代码

    本文给大家介绍如何判断用户是否是用微信浏览器的实例代码,根据关键字 MicroMessenger 来判断是否是微信内置的浏览器,感兴趣的朋友可以参考下实现代码
    2016-06-06

最新评论