什么是Gecko的Javascript解释器引擎语义?

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运行时引擎的正式指称语义是一个谜.经验测试令人筋疲力尽,无法详尽无遗.

  • 是否有可用的权威形式规范或官方参考,明确定义Gecko如何解释Javascript?

参考文献ECMAScript语言规范似乎不够,但是为这些脚本的混合提供了信任,例如,

javascript: alert( function(){return {}}().life=42 )
Run Code Online (Sandbox Code Playgroud)

结合值时具有这种结构的结果意义.

  • 是否存在描述对象和实例评估的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"));
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.,       

部分评估rao.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

chu*_*ckj 2

JavaScript 具有 ECMA 标准中明确说明的急切求值(按值调用)执行模型。所有这些问题都可以通过仔细阅读该标准来解决。例如,上面的结果是11而不是12的原因在标准的11.13.2中有明确的说明。on 在调用 f() 之前评估,而不是在步骤 2 指定的之后评估。