自学内容网 自学内容网

第四话: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); // 4

let 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); //1
    console.log(b); //1
}
fn()
console.log(a);  //2
console.log(b);  //1

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

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

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


原文地址:https://blog.csdn.net/weixin_46726346/article/details/144223969

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!