Eki*_*kim 8 javascript javascript-engine formal-semantics denotational-semantics
考虑以下关于参考ECMAScript语言规范的答案响应- 11.13.2化合物分配
考虑为什么这些,
javascript:
o=""; o = o + (o+=1) ; alert(o);
o=""; o = (o+=1) + o; alert(o);
Run Code Online (Sandbox Code Playgroud)
不一样.从左到右的脚本评估存在时间语义问题(参考:ECMA规范. - 加法运算符).一个结果是+操作员不一定是可交换的.
这可以通过以下方式看出:
javascript:
o=1; o = o + (o+=1) ; alert(o);
o=1; o = (o+=1) + o; alert(o);
Run Code Online (Sandbox Code Playgroud)
要么
javascript:
o=" _ "; o = o + (o+=1) ; alert(o);
o=" _ "; o = (o+=1) + o; alert(o);
Run Code Online (Sandbox Code Playgroud)
懒惰的评估范例,由我错误地和不恰当地使用从而产生下面的问题,也是我个人工作方式的一个不好的属性.
以下考虑因素可能已经得到解决,但似乎没有.如果是这样,是否可以提供与讨论的链接?
Gecko Javascript运行时引擎的正式指称语义是一个谜.经验测试令人筋疲力尽,无法详尽无遗.
参考文献ECMAScript语言规范似乎不够,但是为这些脚本的混合提供了信任,例如,
javascript: alert( function(){return {}}().life=42 )
Run Code Online (Sandbox Code Playgroud)
结合值时具有这种结构的结果意义.
这将澄清调用(或更确切地说,使用)需求,价值,参考,推理,名称......等相关与否的概念.那,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"));
Run Code Online (Sandbox Code Playgroud)
?是否容易预测结果(正确!)?
这个问题有点夸张,因为它是专门eval用来强迫和强调解释的微妙细微差别.是否可以使用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"));
Run Code Online (Sandbox Code Playgroud)
显示:
RA is not shown, partially defined., partially defined., RA is not shown, partially defined., 2, RA is not shown, partially defined.,
部分评估ra与o.n's 不相似!
和以下不太使用的异国情调:
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"));
Run Code Online (Sandbox Code Playgroud)
显示:
, 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(""));
Run Code Online (Sandbox Code Playgroud)
Gecko引擎输出:
Using:
Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.2.3)
Gecko/20100423 Ubuntu/10.04 (lucid) Firefox/3.6.3
The function f() is:
function () {
o.n += 1;
return 10;
}
What the!!?!? initially o.n is 0
Called as a procedure: f() is 10 and so now, o.n is 1
but, instead of 12 o.n+=f() is 11 and so now, o.n is 11
however eval'd o.n+=f() is 22 and so now, o.n is 22!
It makes no functional difference if, instead of o.n, o['n'] is used.
The expected o.n evaluation sequence is 0, 1, (+1+10=) 12, (+1+10=) 23.
_____ _____ _____ _____ _____ _____ _____ _____^^ missing in result
JavaScript 具有 ECMA 标准中明确说明的急切求值(按值调用)执行模型。所有这些问题都可以通过仔细阅读该标准来解决。例如,上面的结果是11而不是12的原因在标准的11.13.2中有明确的说明。on 在调用 f() 之前评估,而不是在步骤 2 指定的之后评估。
| 归档时间: |
|
| 查看次数: |
854 次 |
| 最近记录: |