-
1 # 使用者3592047815189
-
2 # 愛大海的聲音
1. 和其他解釋性語言一樣,javascript 同樣可以解釋執行由javascript原始碼組成的字串,javascript 透過eval()來完成。
2. eval() 其實是一個函式,是javascript很早版本中就已經存在,但是javascript設計者和直譯器對其進行了許多的限制,看起來eval更像一個運算子。但是作為用於動態執行程式碼,eval存在這樣的問題,直譯器無法對動態程式碼做進一步的最佳化。如果將它看做一個函式,那它是可以被賦予其他名字的: var A = eval; var B = A;如果是這樣的話,那麼直譯器就無法最佳化呼叫B()的函數了。因此設計者賦予eval一些運算子的特性(作為保留字)之後這些問題得到解決。當然它還有更多的限制,留待讀者慢慢體會。
3. Eval 只有一個引數,如果傳入的不是字串的話,它直接返回這個引數;如果是字串,那麼首先會進行編譯,如編譯失敗則爆出語法錯誤;編譯成功則執行程式碼。更主要的是eval可以使用呼叫它的變數作用域環境,也就是說它查詢的變數或者新增的變數作用域跟程式碼的完全一樣。如:function A(){ eval("var x ;"); eval("x=1"); //在一個函式中定義或者更改,那就是針對區域性變數。}
4. 全域性eval eval 可以動態執行程式碼,並申明或者改變變數,當然可以對全域性變數進行上述操作。如var globalEval = eval; //定義全域性eval函式別名var a ="global", b = "global"; //全域性變數function c(){ var a = "local"; //區域性變數eval("a+="changed""); //直接更改區域性變數的值 return a; //返回更改後的區域性變數} function d(){ var b = "local"; globalEval("b+="changed""); return b;} console.log(c(), a); //localchanged globalconsole.log(d() , b) //local globalchanged更強的是,全域性的eval還可以更改區域性變數的能力,不過這也是javascript最佳化的一個大問題。 當然在嚴格模式下,eval更像一個運算子,不可以用別名來覆蓋eval。
回覆列表
xout.x是一個儲存了程式碼的字串 eval執行此字串 並將結果賦值給x_real的第(i+1,1)個元素