【每日积累】javascript 一文弄懂eval

news/2025/10/21 8:11:04/文章来源:https://www.cnblogs.com/Dsir/p/19154049

eval 动态化执行语句

概述

eval方法是javascript的全局方法,能够执行含有javascript代码的字符串,虽然eval方法带来强大的动态执行功能,但考虑其负面影响,建议少用,在特殊情况下可以使用eval方法动态改变代码的执行作用域来达到代码的灵活性

动态值,表达式和语句

  console.log(typeof eval('true')) // booleanconsole.log(typeof eval("'9'")) // stringconsole.log(typeof eval('8')) // number

注意点:

  • 如果参数code 含有一个表达式,则计算该表达式并返回该计算值
    console.log(eval('1+1')); // 2
  • 如果参数code 含有一个或者多个javascript语句,则eval方法将执行这些语句
    console.log(eval('1+1')); // 2console.log(eval('8'))  // 单值表达式console.log(eval('8;')) // 单值语句//虽然它们语义不一样,但还是按照js的词法结构在解释器进行解析
  • 为了预防不可预知的错用,同时考虑到实现效率的问题。在ESv3 标准中,给eval加了禁制,不能将eval赋值给另一个属性,然后在代码里面灵活调用和禁止用户覆盖eval属性
   // es3 中let e = eval;console.log(e('8')) //  Evalerror 异常// 目前let e = eval;console.log(e('8+9')); // 17
  • 如果最后一个语句有返回值,则eval则返回这个值
  • 如果参数code 没有返回任何值,则eval返回undefined
    在js中,除了空语句和命令语句之外,一般语句都会有返回值,返回值由执行最后一个子语句或表达式的值决定
    let s = "for (let index = 0; index < 50; index++) { console.log(index);}"// 上面语句会执行 依次打印对应的index 0-49console.log(eval(s)) // undefined 说明eval总会将代码执行的值进行返回,如果没有就返回undefined// 
  • 如果参数code抛出异常,则eval会将异常传递给调用者。
 try {let s = "for (let index = 0; index < 50; index++) { ;}"console.log(eval(s)) // undefined} catch (error) {console.log(error.message); // 返回错误信息}
  • 大部分字符串参数的javascript函数和方法都会接受其他的参数,在继续操作之前把参数强制转换成字符串,但eval方法比较特殊,code参数如果不是原始的字符串,则eval不做任何处理并返回原始值。当传递给eval原始字符串值时,不要传递字符串对象。
    例如:
  let s = new String('1+2') // string 对象console.log(eval(s)); // 返回字符串“1+2”let s1 = "1+2"; // 原始的直接量console.log(eval(s1)) // 3console.log(typeof eval(s1)) // 返回为number类型

对象和函数直接量的歧义问题

  • eval方法能够很轻松地执行普通表达式或者语句,并返回对应的返回值,而在计算下方code则会返回异常产生歧义
    var o = '{user:"c88",pass:"123456"}';console.log(eval(o)) // thorw error
  • 或许你会产生上面表达式是否有错误,其实并没有,如果我们只定义一个属性却是正确的,则就表明对象产生对应的歧义问题!
    var b = '{user:"c88"}';console.log(eval(b)) // c88// 我们平时生成obj对象是 obj = { age : 12 , str:'123' } //key 必须都是字符串,这是正确对象字面量的解析,产生歧义部分的问题:

上述产生歧义是复合语句和冒号导致 为了避免这种歧义采用下方code:

  var o = '({user:"c88",pass:"123456"})';console.log(eval(o)) //{user: 'c88', pass: '123456'}
  • function 也属于一种对象的表达形式,所以要通过function来进行处理字面量也需要避免歧义
    var o = "(function(){ return 8 })()"  console.log(8)orvar o = "(function(){return 8}())" console.log(8)orvar o = "function(){return 8}"console.log(eval("("+o+"())")) // 个人感觉不怎么推荐。
  • 对于数组对象,则不需要考虑上诉情况可以直接进行使用。
    var o = '["123","7777"][0]' console.log(o) // 123

eval全局执行域及其兼容

  • 关于eval全局执行域是在javascript环境中,而javascript代码又必须在一定的环境进行运行,如全局域和局部域,这里的执行域我个人理解为特定的环境,貌似任何都离不开宿主这个词。对于被动态执行的code来说,这个问题就较为复杂,比如eval将在全局域中执行还是局部域之行。如下code example:
    var n  = 1; // global function f(){var n= 3;eval('n=5') // local // 如果想覆盖全局变量window.eval('n=5') //  则下方全局就打印 5console.log(n) // 5}f();console.log(n) //  1

eval当前执行域

  • 看上述例子可以看到,eval在全局执行的时候只会影响同名声明的变量,在函数里面声明只会影响当前作用域的同名变量,外部和内部域是隔离开来的!
    eval("var n = 1");function f(){eval("var n = 2");console.log(n) //2}f();console.log(n) //1

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/941906.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

腾讯云COS通过CDN加速配置指南 - 教程

腾讯云COS通过CDN加速配置指南 - 教程pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Mona…

前端: 如何优化列表大批量的数据渲染

需求点:如何列表数据渲染进行优化? 最近业务上也碰到这个问题点。上网也查了查资料,貌似也经常问,特此写文章记录下来。关于如何处理以上上面的业务痛点: 就两点: 1 、虚拟列表是最主流的解决方案,不渲染所有的…

量子计算25年发展历程与技术挑战

本文回顾了量子信息处理会议25年发展历程,探讨了量子计算从理论到实验的突破,包括量子算法实现、量子复杂性理论对数学的影响,以及当前面临的可扩展性、错误率控制和实际应用等关键技术挑战。25年量子信息处理发展历…

tomcat启动一次问题的处理。

tomcat启动一次问题的处理。说明:2025.10.20,出现启动tomcat对任何请求都没有响应的情况。通过删除 $tomcat/work/Catalina 下的全部数据。并重启解决。但是重启需要的时间比较久。大约5分钟。

软件开发 --- trae如何和环境配合执行

软件开发 --- trae如何和环境配合执行trae会自动执行代码,但是执行前需要我们提前安装好所有的执行环境。 有的环境可能需要手动配合,比如trae在执行这个代码前手动触发环境执行。

marmot的一些特点

marmot的一些特点以前简单介绍过marmot ,以下说下一些特点 特点当前版本已经通过nats server 包内置到了服务中,不需要独立部署nats 了,但是推荐还是部署3个节点 默认内置的nats 没有开启认证,注意使用,同时nats …

应用安全 --- 如何反编译一个超大的函数

应用安全 --- 如何反编译一个超大的函数先用ida反编译一下 再用claude max 完善代码并配合完整的提示词 再次执行上述过程直到没有任何遗漏的代码

藏宝阁

书籍轻松主义★★★★☆反脆弱★★★★★娱乐至死★★★★☆动物庄园★★★★★谈谈方法★★★★☆小说雪中悍刀行★★★★★剑来★★★★★斗破苍穹★★★★★完美世界★★★★★武动乾坤★★★☆☆我在精神病院学斩神…

【模块化解读】commonjs vs commonjs2 exports vs module.exports

背景 最近在用typescript写工具库的时候,无意中在 webpack中看到了两个关键字,commonjs 和 commonjs2. 瞬间产生了好奇。后面看了issues才得知它们与模块化 导出有着密切关系。 CommonJs spec defines only exports.…

【GitHub每日速递 251021】一键将全新Arch安装变身超美现代Web开发系统!Omarchy太神了

原文: https://mp.weixin.qq.com/s/aE_bPqSXRQxxH7zq_4HYIQ 一键将全新Arch安装变身超美现代Web开发系统!Omarchy太神了 omarchy 是一个基于 Arch Linux 和 Hyprland 桌面环境的自动化配置工具。简单讲,它是一套预设…

[Mongodb]mongodb的安装以及增删改查

mongodb的安装 mongo主页 下载完成之后将目录放置下方 /usr/local/安装之后就配置环境变量: vim ~/.bash_profile下方是我自己的环境变量配置 # JDK_HOMEJAVA_HOME=/Library/Java/JavaVirtualMachines/jdk1.8.0_321.j…

PHP 8.5 新特性 闭包可以作为常量表达式了

PHP 8.5 新特性 闭包可以作为常量表达式了 PHP 8.5 又带来了一个让人兴奋的新特性:闭包现在可以作为常量表达式使用了,这意味着它们可以出现在默认参数或属性值中。 你是不是也遇到过这种情况:想在 PHP 中把闭包设置为…

【JavaScript-基础】split,splice,slice 三者的用法

split,splice,slice 三者的用法 很多知识点不熟悉可以自行去下面链接查询: mdn web docs 最近一直忙于搞python,等后续有时间更新python相关的内容。毕竟现在在弄web.有些知识点需要巩固,以便自己后续带人和巩固自己…

2025 代码源 CSP-S 模拟赛复盘

Day 16 T1 双重心 分类讨论一下:是原树的双重心之一,考虑把这条边割掉,接到另一个连通块的任意一个点上都是可行的。 不割掉原树上的双重心的边,两侧的连通块内的的任意一条边可以断开,连通块内相互连边就行。 考…

2025.10.21——1绿

普及+/提高 P1347 排序 wpmx昨晚写的有意思的题,数据范围比较小,我就直接用set+m次拓扑排序,30min写出来,要注意输出顺序后的句号,以及特判n==1

【JavaScript-基础】map、forEach、for、for in、for of等的区别

tips:循环虽好,大家都得按自己所需场景进行使用。个人建议,不喜勿喷 forEach forEach: forEach(item,index,array), item:当前处理的数据,index:下标, array:整个数组 遍历全部数据,不能通过return结束循环,消耗…

dotnet 利用 Windows 注册表实现开机自动启动

本文记录一个开机自动启动实现方法,通过写入到注册表实现开机之后,用户登录完成之后让应用程序开机自启本文将演示写入 HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Run 注册表路线,实现应用程序…

帮我回答这些问题

◦ 以太坊交易的数据结构及EIP1559/712协议的理解。 ◦ 以太坊的账⼾是如何⽣产的,公私钥的关系。 ◦ 以太坊区块链浏览器⼀般会展⽰哪些信息,⼤概能知道。 ◦ 以太坊交易nonce的作⽤,nonce异常交易如何处理。 ◦ 以…

使用uWSGI和Nginx部署深度学习模型指南

本文详细介绍了如何通过uWSGI应用服务器和Nginx反向代理将深度学习模型部署为可扩展的Web服务,涵盖WSGI协议原理、服务器配置步骤及性能优化要点,帮助构建高并发生产级AI应用。如何使用uWSGI和Nginx部署深度学习模型…

Python 类属性的应用场景

Python 类属性的应用场景 在面向对象编程中,类属性作为一种特殊的属性形式,始终扮演着“共享者”与“管理者”的角色。与实例属性为每个对象单独存储数据不同,类属性属于类本身,被所有实例共同拥有和访问。这种特性…