国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 語言 > JavaScript > 正文

對JavaScript的eval()中使用函數的進一步討論

2024-05-06 14:17:35
字體:
來源:轉載
供稿:網友
var func = eval("(function(){})");
alert(typeof func);
--------
更進一步的問題是,書中對匿名和具名函數在JScript與SpiderMonkey中的表現解釋得不夠
清楚。好的,這篇文章就這個問題深入討論,不單涉及書中的內容,也更深入地講述一
下JS的解釋與執行過程——其實所有的內容在書中都有涉及,但過于分散,不便于專門
地來分析一個具體問題。

首先,應該明確表達式與語句。對于JS來說,eval()總是試圖執行一個語句,因此它必須
先將執行文本理解為語句。如下:
--------
eval("1")
--------
在JS看來,由于eval()必須執行語句,因此"1"不再是直接量表達式,而是直接量表達式語
句,也就是相當于“1;”。這些內容,在“5.2.2  動態執行過程中的語句、表達式與值”
中有詳細解釋。

所以,eval()的返回值,其實是語句最后一個(有效的)子句的返回值。接下來,我們需
要了解“聲明語句”和“表達式”。例如:
--------
function x() {
  //....
}
--------
很明顯,這是一個具名函數的“聲明語句”。注意的是,“聲明語句”是不返回值的。也
就是說,聲明語句是在語法解釋期,由預編譯器處理的,而在執行期它是沒意義的——沒
有值,也沒有返回值。例如單純的“var X”,是一個聲明語句,它就不會返回值,而對于
“var X=100”來說,JS就處理成一個聲明語句,和一個在執行期的賦值語句,它就有返回
值(后者的值)。

上面的規則對于JScript和SpiderMonkey來說都是一樣的,這沒有區別。有區別的是接下來的
內容。首先,SpiderMonkey承認“函數表達式(function expression)”,為了直接這樣一種
特性,它約在“函數表達式”中出現的“函數名”是無效的。因為“函數名”是“聲明語
句”來陳述的,而“表達式”是比語句更小(或更低級)的一個級別,因此不可能在“表
達式”中出現“語句聲明”,所以只好在表達式中忽略函數名。這樣一來,SpiderMonkey中
下面語句:
--------
x = "1234" + (function X() {});
------
中函數X就沒有標識符的效果,它對表達式之外的、或者全局的“標識符”都不會構成影
響。更進一步地說:
--------
var X = 100;
x = "1234" + (function X() {});
------
在這樣兩行代碼中,變量X不會被重寫,因為第二行中的函數名X是無效的。關于這些內
容,在書中“5.4.2.1  語法聲明與語句含義不一致的問題”有詳細解釋。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表

圖片精選

主站蜘蛛池模板: 汕尾市| 明溪县| 栾川县| 新沂市| 博白县| 靖州| 天柱县| 汤阴县| 丘北县| 永清县| 江西省| 金门县| 抚州市| 建湖县| 朝阳市| 聊城市| 昭觉县| 徐水县| 惠来县| 科技| 永济市| 内江市| 崇义县| 阳春市| 景东| 宁远县| 张北县| 新化县| 宁陵县| 施秉县| 安宁市| 天等县| 缙云县| 军事| 平南县| 苗栗市| 嘉鱼县| 肥乡县| 兴和县| 景德镇市| 广宗县|