第四话: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。