2012-09-13 58 views
0

在功能代碼,當我這樣做:爲什麼eval()代碼中的語法錯誤被忽略?

eval('var default = 100;'); 
alert(default); 

瀏覽器的JS引擎*將拋出一個語法錯誤的聲明,就好像第一個語句成功執行。

在這裏看到:http://jsfiddle.net/4FMdy/打開瀏覽器的console查看錯誤日誌

然而,當我從代碼中刪除第二條語句,讓我只有這個:

eval('var default = 100;'); 

瀏覽器的JS引擎在該語句上拋出語法錯誤。

在這裏看到:http://jsfiddle.net/4FMdy/1/

我不明白這一點。如果第一個語句拋出語法錯誤(因爲它應該),爲什麼只有第二個語句在我上面的第一個示例中拋出這樣的錯誤。據我所知,如果一個語句拋出一個錯誤,這必然意味着所有以前的語句(同一個調用)成功執行。

順便說一句,語法錯誤引發是因爲default是JavaScript中的保留字,所以它不能用作變量名。

此外,沒有「eval是邪惡的」評論請。我只是想了解瀏覽器的JS引擎的行爲。

*我在Firefox測試和Chrome

回答

2

只是一個假設:

腳本塊首先將被解析,而不是執行過程中(EVAL)

瀏覽器只檢測語法錯誤線#2,未執行完畢腳本塊,所以他不會決定EVAL語法錯誤()

當你把2線在2個不同的腳本元素您會收到兩個錯誤:

http://jsfiddle.net/doktormolle/CfRmj/

+0

是的,就是這樣。現在我明白了。首先必須將令牌流解析爲* Program *,然後才能評估生成的程序。 [第二段中的信息](http://es5.github.com/#x5.1.4)。根據語法語法,令牌'alert','(','default',')'和';'不是一個有效的序列。所以,這個程序是無效的,因此根本沒有**評估。在傳遞給'eval()'的字符串中出現的任何語法錯誤只有在程序被評估時才能被檢測到,這是根據語法語法分析後的*。 –

0

因爲 「默認」 是的JavaScript保留關鍵字:)

所以警報(默認)拋出 「語法錯誤」 如果檢查代碼是否正確,但是然後函數eval運行,並且由於第一個錯誤而導致進程wount到達此處。