eval函式的問題

2021-07-04 20:53:39 字數 1025 閱讀 9978

1)因為eval必須執行編譯器,所以效率低。同時js除了顯式的eval外,還有隱式呼叫eval,如function建構函式,settimeout,setinterval函式傳遞字串引數的形式。如settimeout(「obj.show1()」,100)和settimeout(obj.show1,100);是不一樣的。所以在使用settimeoutsetinterval等 function 的時候,最好傳入 function 的引用,而不是字串。

2)減弱了web應用的安全性,因為他被賦予太多的許可權。因此ajax獲取伺服器的資料解析時候不用eval,而是用json.parse以及json.stringify

可以通過兩種方式解除安全風險:帶注釋的json以及帶字首的json,這兩種方式就是dojo中避免json劫持的方法

3)沒有eval的**比有eval的**快100倍以上,這是因為js在執行前會進行類似預編譯的操作:首先會建立乙個當前執行環境的活動物件,並將var宣告的變數設定為活動物件的屬性,但此時這些變數的值都是undefined,還會將以function定義的函式也新增為活動物件的屬性,而他們的值正是函式的定義。如果使用了eval,那麼eval中的**,也就是字串無法預先識別其上下文,無法被提前解析和優化,即無法進行預編譯的操作,所以**效能會大幅度降低。

例1:直接在函式裡呼叫eval不會汙染全域性變數

function test2()

test2();

alert(c);//報錯,,eval被當作關鍵字使用(eval在js中也是關鍵字),只在區域性變數使用!

例2:(window.eval可以在全域性中訪問到)

function test1()

test1();

alert(b);//列印1

例3:(將eval函式變成區域性變數也可以在全域性訪問)

function test()

test();

alert(a);//列印1

eval 函式的用法

eval s 函式將去掉字串s最外側的引號,並按照python語句方式執行去掉引號後的字元內容。使用方式如下 變數 eval 字串 a eval 1.2 print a 輸出結果 1.2猶如 pybook 123a eval pybook print a 值得注意的是 a eval pybook p...

eval函式的坑

開發工作中遇到這樣一種情形,需要執行使用者輸入的php 串,於是決定使用eval函式。coding大概示例如下 function getstr str php getstr wujuntian s eval php echo s 結果列印出來的結果一直是空的,使用var dump 列印出來是null...

模組 eval函式

模組 1.模組是python程式架構的乙個核心概念 在匯入模組時,每個匯入應該獨佔一行 import 模組1 import 模組12 在匯入模組後,我們通過 模組名.的方式,使用模組提供的工具 2.使用as指定模組的別名 如果模組的名字太長,可以使用as指定模組的名稱,以方便在 中使用 語法 imp...