EVAL和new function的区别

问题: eval(Response.text) 会报错,而需要这样来写 eval('(' + response.text + ')');

例如:

1 var jsonStr = "{'a:':'b'}";
2 var object = eval(jsonStr);  //会报错
3 var object = eval('(' + jsonStr + ')');  //则会正确解析

原因:

1. 不加括号eval时,js会把{}当成代码块,而'a':'b'当成语句来进行解析,那么肯定会报语法错误;

 

2. '(' + jsonStr + ')'后,代码字符串变成 ({'a':'b'}),那么该代码是个正确的js赋值代码

那么,对于将字符串解析成function,js中存在两个:eval 和 new Function,他们的区别在于:作用域不同,具体表现为:

1 var str = 'console.log(a)';
2 var a = 0;
3 (function() {
4   var a = 1;
5   eval('(' + str + ')');                                 //返回1
6   window.eval('(' + str + ')');                          //返回0
7   (new Function('return ' + str))();                     //返回0
8 })();
9                     

对于JS的函数作用域来说,变量作用域有任意层级,即 其他函数内部定义的函数可以调用父函数的局部变量,而内部函数里定义的函数不仅可以调用父函数的局部变量,还可以调用祖父函数的局部变量,以此类推。 —— 摘自 《Javascript编程精解》

因此,对于上述例子来说,window.eval和new Function都是全局作用域的,即他们只能调用全局变量;而eval是局部函数,即他可以调用其父函数的局部变量。

PS:函数如何声名为全局函数,存在以下方式:

  • 直接在全局作用域下声明变量 
  • 是把变量绑定在window上
  • 是不加var 直接赋值
  • 用new Function和window.eval这种方式去初始化变量
posted on 2012-11-16 11:13  SHINE.LI 阅读( ...) 评论( ...) 编辑 收藏

转载于:https://www.cnblogs.com/shine-li/articles/2772737.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值