聊城陽谷網(wǎng)站建設(shè)百度官網(wǎng)優(yōu)化
theme: channing-cyan
1.不要使用eval!
如果你從來都沒有用到過eval這個函數(shù),甚至你都不知道這個函數(shù)的作用。那么我只能說:你做了一件正確的事情 o.O
雖然我這篇文章要說一下eval函數(shù)的一些能力和注意點(diǎn),但是我希望,如果讀者看完了這篇文章。在以后的學(xué)習(xí)和工作上,如果遇到了某個問題,可千萬別想到這篇文章或者eval這個方法。
為什么呢,因?yàn)樵贘avascript初期,這門語言還不完善,所以會用到eval這個方法去解決一些問題。但是Javascript發(fā)展到今天這個程度,我們已經(jīng)不需要使用eval這個方法了。如果你想用這個方法,那么一定有其他更好的方式等著你。
而且,eval這個方法是有安全和性能問題的,所以千萬不要使用,當(dāng)然如果不怕被同事噴的話也可以。
2.eval函數(shù)的使用
首先,這個方法的入?yún)⑹呛芎唵蔚?#xff0c;就一個字符串。
當(dāng)這個字符串為表達(dá)式的時候,eval函數(shù)就返回這個表達(dá)式的值。
當(dāng)這個字符串是語句的時候,eval函數(shù)就執(zhí)行這些語句。
簡單吧,看下面的例子:
var a = 2;
eval("a += 2");
console.log(a); // 4let x = eval("1 + 1");
console.log(x); // 1
這個時候,有想法的人就會尋思了,這個eval函數(shù)里,好像還能訪問變量啊。那他訪問的變量是局部的呢?還是全局的呢?
咱們來試一下就知道了:
var x = "global"
function f() {var x = "local";eval("x += 'change'");return x;
}
console.log(f(), x); //localchange global
執(zhí)行完我們發(fā)現(xiàn),奧原來是這樣,eval訪問的屬性是局部變量。
我們能這么輕易的下結(jié)論嗎!!!!不能,我們來個花活,看下面代碼:
var y = "global";
var geval = eval;
function g() {var y = "local";geval("y += 'changed'");return y
}
console.log(g(), y); //local globalchanged
wc?你會發(fā)現(xiàn),當(dāng)我們把eval這個方法賦值給其他變量后,再通過這個變量去調(diào)用,他訪問的就是全局屬性了。
但是捏,在JS中,如果你處在嚴(yán)格模式下,這個eval函數(shù)就被管控了,他就只能訪問或者更改局部的屬性,全局的屬性他是改不了滴。
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定義的變量也是全局變量。太嚇人了!!!!!
當(dāng)然,要注意一點(diǎn),在嚴(yán)格模式下,我們不能通過eval定義變量。只能訪問變量或者修改變量。
最后,希望這篇文章對你有所幫助,并且,千萬不要使用eval。