问题: 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这种方式去初始化变量
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了