Eval and new funciton not the same thing

 更新时间:2012年12月27日 15:32:22   投稿:mdxy-dxy  
以前有人会说,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也有特殊的用途,只是在不清楚的情况下还是少用为妙。

这里作个备份:

代码:
复制代码 代码如下:

// 友善提醒:为了你的手指安全,请在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);'))();

相关文章

  • js实现兼容IE和FF的上下层的移动

    js实现兼容IE和FF的上下层的移动

    本来是很简单的一个功能,可是一开始弄的时候,还有IE能实现,FF总是不能实现,在网上看了半天,也没弄出个所以然,所以在同事的帮忙下,总算弄出来了,浏览器的兼容性考的还是细节上面的东西,所有关于细节的,我会用注释标出来的。
    2015-05-05
  • 13个PHP函数超实用

    13个PHP函数超实用

    这篇文章为大家整理了13个PHP函数超实用,函数是PHP如此强大的源泉,但是很多PHP函数并没有得到充分的利用,本文的13个PHP函数大家一定要真正掌握。
    2015-10-10
  • 关于Ext中form移除textfield方法:hide(),setVisible(false),remove()

    关于Ext中form移除textfield方法:hide(),setVisible(false),remove()

    根据条件来控制是否显示form里的textfield表单
    2010-12-12
  • Js+Flash实现访问剪切板操作

    Js+Flash实现访问剪切板操作

    最近需要遇到了这个问题点击按钮复制链接的功能果断度娘谷哥,最后找到得解决方案ZeroClipBoard一款开源得js+Flash实现得剪切板操作
    2012-11-11
  • 微信小程序实现客服功能(客服消息)的全过程

    微信小程序实现客服功能(客服消息)的全过程

    在最近做的微信小程序中需要实现一个自带的客服功能,下面这篇文章主要给大家介绍了关于微信小程序实现客服功能(客服消息)的相关资料,文中通过实例代码介绍的非常详细,需要的朋友可以参考下
    2022-12-12
  • JSON与js对象序列化实例详解

    JSON与js对象序列化实例详解

    这篇文章主要介绍了JSON与js对象序列化,结合实例形式详细分析了JavaScript与JSON序列化操作的相关实现技巧与注意事项,需要的朋友可以参考下
    2017-03-03
  • JavaScript使用math.js进行精确计算操作示例

    JavaScript使用math.js进行精确计算操作示例

    这篇文章主要介绍了JavaScript使用math.js进行精确计算操作,结合实例形式分析了开源库math.js进行高精度数学运算相关操作技巧,需要的朋友可以参考下
    2018-06-06
  • JavaScript股票的动态买卖规划实例分析上篇

    JavaScript股票的动态买卖规划实例分析上篇

    这篇文章主要介绍了JavaScript对于动态规划解决股票问题的真题例举讲解。文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-08-08
  • js Canvas实现圆形时钟教程

    js Canvas实现圆形时钟教程

    这篇文章主要为大家详细介绍了HTML5 Canvas实现圆形时钟简易教程,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2016-09-09
  • 解决layui的table.checkStatus失效问题

    解决layui的table.checkStatus失效问题

    这篇文章主要介绍了解决layui的table.checkStatus失效问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-10-10

最新评论