eval語法報錯 ie10 全面了解eval

2021-10-14 03:51:34 字數 1808 閱讀 3546

一、eval的基本概念

eval會將傳入的字串當作js**來執行,返回值是執行的結果,比如:

eval('2 + 2') //4
如果傳入的引數不是字串,eval會將引數原樣返回:

eval(new string("2 + 2")) //返回乙個包含"2+2"的字串物件 string
二、eval的實際用處

將字串解析成物件

var str = json.stringify()

eval(str) // uncaught syntaxerror: unexpected token ':'

eval("(" + str + ")") //

eval(str)會報語法錯誤,是因為eval把傳入的字串引數""當作表示式來求值,因為不是乙個合法的表示式,因此會報出語法錯誤。js中的表示式都有哪些型別,詳見

表示式和運算子​developer.mozilla.org

而第二句eval("(" + str + ")")不會報錯,是因為()是乙個正確的表示式,在瀏覽器控制台執行這個表示式,得到的是,這就是圓括號運算子的神奇之處。

你可能會問,已經有json.parse可以把字串解析成物件了,為什麼還會有用eval解析的應用場景呢?二者之間的區別是什麼呢?

eval("()") // 

json.parse("()") // uncaught syntaxerror: unexpected token ( in json at position 0

json.parse只能解析正確的json字串,也就是說屬性名也必須得用引號包裹,否則就會丟擲異常。

而eval不僅可以解析正確的json字串,還可以解析屬性名不帶引號的物件字串,如果你的專案中有類似的應用需求,eval就能派上用場了。

2. 讓函式裡的**在全域性作用域中執行

通過eval執行的**具有與eval相同的作用域,假設這樣乙個場景,通過ajax獲得一段js**,需要在全域性作用域中執行這段**,但是這段**的獲取是在某個函式中,那麼如何在eval的幫助下實現這個需求呢?

function test () 

test()

進一步寫個demo驗證下:

function test () "

window.eval(jsstr)

}test()

fun() // 1

你可能會想問,js中還有乙個用法也能動態解析和執行js字串,那就是new function(),那麼二者之間的區別是什麼呢?

eval中的**執行時的作用域為當前作用域,它可以訪問到函式中的區域性變數,但是new function執行時的作用域始終是全域性作用域。

var a = 'global scope'

function fun()

fun()

三、一道面試題

最後用一道面試題來檢驗上面的學習成果:實現乙個json.parse

有兩種方法:

eval

function jsonparse (str)
2. new function

function jsonparse (str)

Css gray 無法覆蓋IE10

變灰這個效果很常見,在我這裡暫時沒有找到最優解決方式,先把今天的研究結果記錄一下。第一種方案 對所有靜態資源檔案進行灰度處理,得到新乙個資源目錄,例如asset ori 原始資源 asset gray灰度資源,將檔案對映指向灰度資源 這裡面包括對img以及css中所有顏色屬性的處理,css裡面最好不...

IE 10無法登陸

今天 遇到 ie10不能登陸的bug 摸索了半天,終於解決問題,在這裡跟大家分享下,希望對大家有所幫助 下面是驗證是否登入的標記 是否登陸 public static bool islogin 在ie10中登入時 islogin的值始終都是false 原因是在於c windows microsoft...

Vue CLI 3 配置相容IE10

最近做了乙個基於vue的專案,需要相容ie瀏覽器,目前實現了打包後可以在ie10以上執行,但是還不支援在執行時相容ie10及以上。vue2.0 相容ie9及其以上 安裝依賴 yarn add dev babel polyfill在入口檔案main.js引入依賴 import babel polyfi...