推荐内容
要牵强一些的。因为我们修改一下:
--------
// 第二种情况
var func = eval("(1, function(){})");
alert(typeof func); // 显示"function"
--------
就不同了。那么到底为什么第一种情况下,JScript就一定是理解为“声明语句”而不是表达
式呢?我不得确知。我只是从:
--------
// 第三种情况
var X;
eval("(function X(){})");
alert(typeof X); // 显示"function"
--------
这种情况下存在“语句声明”的效果来推断第一种情况的。更为奇特的是,我不清楚为什
么JScript容许在一个表达式运算符“(...)”中存在一个“语句”——因为理论上说,这种情
况是在语法分析中难于解释的。我甚至在“5.4.2.1 语法声明与语句含义不一致的问题”提
到下面的代码:
--------
// 示例5:语法声明阶段重写
// 重写
(function Object(){
}).prototype.value = 100;
// 显示值undefined
var obj = new Object();
alert(obj.value);
--------
是因为执行期“(X).prototype.value”中的那个函数X,与语句分析期覆盖了全局的Object标识
符的函数,不是同一个。但,我仍然不明白,为什么JScript允许在表达式中存在声明语句。
与此更为相悖的是,如果要承认这样的假设,那么为什么下面的语句不能执行:
--------
(var x=100);
--------
然而如果不承认,那么下面的代码却又能正常执行:
--------
(function X() {});
--------
OH... 在这个问题的最终答案上,我仍然是迷惑的。







评论列表