当前位置: 首页 > news >正文

第四话:JS中的eval函数


theme: channing-cyan

1.不要使用eval!

如果你从来都没有用到过eval这个函数,甚至你都不知道这个函数的作用。那么我只能说:你做了一件正确的事情 o.O

虽然我这篇文章要说一下eval函数的一些能力和注意点,但是我希望,如果读者看完了这篇文章。在以后的学习和工作上,如果遇到了某个问题,可千万别想到这篇文章或者eval这个方法。

为什么呢,因为在Javascript初期,这门语言还不完善,所以会用到eval这个方法去解决一些问题。但是Javascript发展到今天这个程度,我们已经不需要使用eval这个方法了。如果你想用这个方法,那么一定有其他更好的方式等着你。

而且,eval这个方法是有安全和性能问题的,所以千万不要使用,当然如果不怕被同事喷的话也可以。

2.eval函数的使用

首先,这个方法的入参是很简单的,就一个字符串。

当这个字符串为表达式的时候,eval函数就返回这个表达式的值。
当这个字符串是语句的时候,eval函数就执行这些语句。

简单吧,看下面的例子:

var a = 2;
eval("a += 2");
console.log(a); // 4let x = eval("1 + 1");
console.log(x); // 1

这个时候,有想法的人就会寻思了,这个eval函数里,好像还能访问变量啊。那他访问的变量是局部的呢?还是全局的呢?

咱们来试一下就知道了:

var x = "global"
function f() {var x = "local";eval("x += 'change'");return x;
}
console.log(f(), x); //localchange global

执行完我们发现,奥原来是这样,eval访问的属性是局部变量。

我们能这么轻易的下结论吗!!!!不能,我们来个花活,看下面代码:

var y = "global";
var geval = eval;
function g() {var y = "local";geval("y += 'changed'");return y
}
console.log(g(), y);  //local globalchanged

wc?你会发现,当我们把eval这个方法赋值给其他变量后,再通过这个变量去调用,他访问的就是全局属性了。

但是捏,在JS中,如果你处在严格模式下,这个eval函数就被管控了,他就只能访问或者更改局部的属性,全局的属性他是改不了滴。

3.eval定义变量

在eval中,我们能否定义一个变量呢?试一下:

eval("var a = 1");
console.log(a); //1

哎!没毛病,那定义变量的话,会不会有全局和局部的问题呢?我们按照刚才的方法也试一下呗:

var a = 2, b = 2
function fn(){eval("var a = 1");geval("var b = 1");console.log(a); //1console.log(b); //1
}
fn()
console.log(a);  //2
console.log(b);  //1

哦莫莫,所以通过geval定义的变量也是全局变量。太吓人了!!!!!

当然,要注意一点,在严格模式下,我们不能通过eval定义变量。只能访问变量或者修改变量。

最后,希望这篇文章对你有所帮助,并且,千万不要使用eval。

http://www.lryc.cn/news/496439.html

相关文章:

  • 歇一歇,写写段子
  • TypeScript (一)运行环境配置,数据类型,可选类型,联合类型,type与interface,交叉类型,断言as,字面量类型,类型缩小
  • Linux Find 命令详情解释
  • 2024年认证杯SPSSPRO杯数学建模A题(第一阶段)保暖纤维的保暖能力全过程文档及程序
  • Milvus python库 pymilvus 常用操作详解之Collection(下)
  • 李飞飞:Agent AI 多模态交互的前沿探索
  • [October 2019]Twice SQL Injection
  • Python爬虫——城市数据分析与市场潜能计算(Pandas库)
  • 如何搭建JMeter分布式集群环境来进行性能测试
  • 【Halcon】 derivate_gauss
  • stm32中systick时钟pinlv和系统节拍频率有什么区别,二者有无影响?
  • 柔性数组详解+代码展示
  • 前端入门指南:Webpack插件机制详解及应用实例
  • C++备忘录模式
  • 【Electron学习笔记(四)】进程通信(IPC)
  • Java 中的 remove 方法深度解析
  • 企业品牌曝光的新策略:短视频矩阵系统
  • 【初阶数据结构与算法】二叉树顺序结构---堆的应用之堆排、Top-K问题
  • vue3 + ts 使用 el-tree
  • Create Stunning Word Clouds with Ease!
  • html+css网页设计 旅游 马林旅行社5个页面
  • python selenium(4+)+chromedriver最新版 定位爬取嵌套shadow-root(open)中内容
  • React基础教程(11):useCallback记忆函数的使用
  • arp-scan 移植到嵌入式 Linux 系统是一个涉及多个步骤的过程
  • 【Linux】常用命令一
  • 在鲲鹏麒麟服务器上部署MySQL主从集群
  • Siknhorn算法介绍
  • 群控系统服务端开发模式-应用开发-邮箱短信通道功能开发
  • [docker中首次配置git环境]
  • 书生浦语·第四期作业合集