本篇文章跟大家介紹一下JavaScript中eval()函數的用法。有一定的參考價值,有需要的朋友可以參考一下,希望對大家有幫助。
呼叫eval函數,可以將其參數當作javascript程式來解釋。換句話說,eval可以把它的參數當作程式碼
來執行。
function f(x) { eval('var y=x'); console.log('y:', y); } f('hello');//y:hello
在這個範例中,eval
將它的string
參數var y=x
當作一行程式碼執行了,在函數f
內部宣告了一個局部變數y
。這和
function f(x) { var y=x; console.log('y:', y); } f('hello');//y:hello
的執行效果基本上相同。
允許eval函數幹擾作用域,是一個相當錯誤的做法。這種做法會使一段程式碼變得難以理解,並且不再安全。下面這個例子便賦予了外部呼叫者修改局部變量,改變局部作用域的能力。
例子
let g = '全局变量' function f(src) { eval(src); console.log('g:', g); } //以上为源代码 f("var g= '局部变量'");//g:局部变量 f("var y= '局部变量'");//g:全局变量
當我們把一個沒有在原始碼中定義的變數y
,傳入eval
函數時,這段程式碼執行的結果將變得難以預測。
保證eval
函數不會影響外部作用域的簡單方法是使用巢狀的作用域。 ES5的嚴格模式
便是這樣做的。
範例
let g = '全局变量' function f(src) { (()=> eval(src))();//在嵌套作用域中执行eval console.log('g:', g); } //以上为源代码 f("var g= '局部变量'");//g:全局变量 f("var y= '局部变量'");//g:全局变量
當函數呼叫涉及eval
標識符時,可以稱為直接呼叫。此時,被執行的程式(eval的參數)具有完全存取呼叫者局部作用域的權限。
範例
const g = '全局变量'; function foo() { const g = '局部变量'; console.log(eval('g'));//直接调用,可以访问到foo的局部作用域,所以输出的是局部变量g } foo(); //局部变量
綁定eval
到另一個變數名,在透過該變數呼叫eval
,稱之為間接呼叫。此時,被執行的程式(eval的參數)失去對局部作用域的存取能力。利用逗號運算子,
,可以實作間接呼叫的簡潔寫法。
範例
const g = '全局变量'; function foo2() { const g = '局部变量'; cont test = eval; //间接调用,不能访问函数内部的变量g console.log(test('g')); //全局变量 //间接调用简洁方式 console.log((0, eval)('g'));//全局变量 }
更多程式設計相關知識,請造訪:程式設計入門! !
以上是聊聊JavaScript中eval()函數的用法的詳細內容。更多資訊請關注PHP中文網其他相關文章!