编辑
考虑到下面关于参考ECMAScript 语言规范 - 11.13.2 复合赋值的答案响应
考虑到这些原因,
javascript:
o=""; o = o + (o+=1) ; alert(o);
o=""; o = (o+=1) + o; alert(o);
不一样。从左到右的脚本评估存在时间语义问题(参考:ECMA 规范 - 加法运算符)。结果之一是+
运算符不一定是可交换的。
这也可以通过以下方式看到:
javascript:
o=1; o = o + (o+=1) ; alert(o);
o=1; o = (o+=1) + o; alert(o);
或者
javascript:
o=" _ "; o = o + (o+=1) ; alert(o);
o=" _ "; o = (o+=1) + o; alert(o);
懒惰的评估范式,被我错误地和不恰当地使用,从而产生了下面的问题,也是我个人作案手法的一个坏属性。
原帖
以下考虑可能已经得到解决,尽管似乎没有。如果是这样,是否可以提供讨论的链接?
Gecko Javascript 运行时引擎的正式指称语义是一个谜。实证检验是令人筋疲力尽的,不可能是详尽无遗的。
- 是否有权威的正式规范或官方参考准确定义 Gecko 如何解释 Javascript?
参考,ECMAScript 语言规范,似乎不够,尽管为这样的脚本的混合物提供了可信度,例如,
javascript: alert( function(){return {}}().life=42 )
在绑定值时具有此类构造的后续含义。
- 是否有一个明确的范例来描述对象和实例评估的 Javascript 代码解释?
这将阐明调用(或更确切地说是使用)需要、价值、参考、推断、名称……的概念是否相关。也就是说,Javascript 是一个原型解释器,它为以下一些问题提供了隐含的含义。
什么是预期结果:
javascript: o={n:0}; f=function(){o.n+=1; return 10};
alert([
o.n, f(),
o.n, o.n+=f(),
o.n, eval('o.n+=f()'),
o.n, eval('o.n+='+f()),
o.n,
].join(",\t"));
? 预测结果是否容易(正确!)?
这个问题有点修辞,因为它是专门设计的eval
's 来强制和强调解释的细微差别。是否可以使用ECMAScript 语言规范或其他文档来解决此脚本的评估(以及下面的问题) ?
(顺便说一句,考虑:
javascript: ra=[];
alert([
ra, ra[ra.length]=" partially defined.",
ra, ra.push("\n RA is not shown"),
ra, ra.reverse()[42],
].join(",\t\t"));
显示:
RA 未显示,部分定义。,部分定义。, RA 未显示,部分定义。,2, RA 未显示,部分定义。
其中 的部分评估ra
不类似于o.n
's!
以及以下比使用 on 更少异国情调的内容:
javascript: o=""; f=function(){o+=1; return 0};
alert([
o, f(),
o, o+=f(),
o, eval('o+=f()'),
o, eval('o+='+f()),
o,
].join(",\t"));
显示:
, 0, 1, 10, 10, 100, 100, 10010, 10010
)
考虑以下脚本:
javascript:
asn="\t\t and so now,\t o.n is "; nl="\n\n";
o={}; f=function(){o.n+=1; return 10};
alert(["Using:\n",window.navigator.userAgent,
nl,"The function f() is:\n ",f,
nl,"What the!!?!? \t\t\t\t\t\t\t initially \t\t o.n is ", o.n = 0,
nl,"Called as a procedure: \t\tf() is ", f(), asn, o.n,
nl,"but, instead of 12 \t\to.n+=f() is ", o.n+=f(), asn, o.n,
nl,"however eval'd\t\to.n+=f() is ", eval("o.n+="+f()), asn, o.n,
"!\n\nIt makes no functional difference if, instead of o.n, o['n'] is used.",
"\nThe expected o.n evaluation sequence is 0, 1, (+1+10=) 12, (+1+10=) 23.",
"\n_____ _____ _____ _____ _____ _____ _____ _____^^ missing in result",
].join(""));
Gecko 引擎输出:
使用: Mozilla/5.0(X11;U;Linux i686;en-US;rv:1.9.2.3) Gecko/20100423 Ubuntu/10.04(清醒)Firefox/3.6.3 函数 f() 是: 功能 () { 在 += 1 上; 返回 10; } 什么!!!!!最初为 0 作为过程调用:f() 为 10,所以现在 on 为 1 但是,o.n+=f() 不是 12,而是 11,所以现在,on 是 11 但是 eval'd o.n+=f() 是 22,所以现在 on 是 22! 如果使用 o['n'] 而不是使用 on,则在功能上没有区别。 评估序列的预期值为 0、1、(+1+10=) 12、(+1+10=) 23。 _____ _____ _____ _____ _____ _____ _____ _____^^ 结果中缺失