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