2013-09-21 66 views

回答

5

{a:1}具有在Javascript

兩種含義
  • 對象文本(如在x = {a:1}
  • 的方塊帶有標籤的代碼(如while(x) {a:1}

具體的解釋取決於解析器遇到開口時的狀態{。在「聲明」狀態{a:1}將是一個塊,處於「表達」狀態 - 文字。由於解析總是從語句狀態開始,所以{a:1} && x將被讀爲block && expression,這是一個語法錯誤。相反,在x && {a:1},&&強制解析器處於「表達式」狀態,並且{a:1}將是文字(無錯誤)。

爲了確保{a:1}始終是一個文字,請在其之前放置一個操作符或大括號以使其成爲表達式,例如, +{a:1}!!{a:1}({a:1})

3

的問題是,該第二串具有{,將其作爲一個塊的開始,而不是對象文本的開頭開始。試試這個:

eval("({a:1}) && {b:2} && alert('this should be ok~~');") 

通過在第一個對象周圍加上括號,它不會被解釋爲一段代碼的開始。 (第二個對象,{b:2}是可以的,因爲它的&&後出現因此在該點的解釋是,不能指望塊。)

http://jsfiddle.net/q3sZ9/1/

請注意,這並不是因爲你使用eval():如果您把你的字符串的內容直接放在你的腳本中你會遇到同樣的問題。