标签: ecma262

如何改进ECMAScript实现的递归功能?

经过一些反复测试后,我发现我的实现无法处理非常多的递归.虽然我在Firefox中运行了一些测试后发现这可能比我原先想象的更常见.我认为基本问题是我的实现需要3次调用来进行函数调用.第一次调用是一个名为的方法Call,它确保调用可调用对象并获取任何引用参数的值.第二次调用是在一个名为的方法Call中定义的ICallable接口.此方法创建新的执行上下文,并在尚未创建lambda表达式的情况下构建它.最后调用是函数对象封装的lambda.显然,进行函数调用非常繁重,但我确信通过一些调整,我可以在使用此实现时使递归成为可行的工具.

public static object Call(ExecutionContext context, object value, object[] args)
{
    var func = Reference.GetValue(value) as ICallable;
    if (func == null)
    {
        throw new TypeException();
    }
    if (args != null && args.Length > 0)
    {
        for (int i = 0; i < args.Length; i++)
        {
            args[i] = Reference.GetValue(args[i]);
        }
    }
    var reference = value as Reference;
    if (reference != null)
    {
        if (reference.IsProperty)
        {
            return func.Call(reference.Value, args);
        }
        else
        {
            return func.Call(((EnviromentRecord)reference.Value).ImplicitThisValue(), args);
        } …
Run Code Online (Sandbox Code Playgroud)

c# optimization recursion runtime ecma262

5
推荐指数
1
解决办法
189
查看次数

如何确保ES3程序在ES5引擎中运行?

所以ECMAScript 5引入了与ECMAScript 3的一些不兼容性.


示例:

已经写了许多文章,说明在ES5严格模式下this === null || this === undefined是可行的:

"use strict";
(function () {
    alert(this); // null
}).call(null);
Run Code Online (Sandbox Code Playgroud)

但是,标准 真正建议的是ES5引擎在非严格模式下也允许这样:

15.3.4.3 ...将thisArg值作为this值传递而不进行修改.这是对第3版的更改,其中a undefinednullthisArg替换为全局对象,ToObject应用于所有其他值,并将结果作为this值传递.

目前,IE9是唯一以这种方式实际实现ES5的浏览器,事实证明这可能会破坏当前的脚本.大.


ES5规范的 Annix E 列出了许多其他不兼容性.

那么,确保我们久经考验的ES3脚本能够完美运行的最佳方法是什么?某种自动化测试套件?我们必须手动测试吗?

javascript backwards-compatibility ecma262 ecmascript-5

5
推荐指数
2
解决办法
1870
查看次数

DontDelete javascript对象的属性

根据EcmaScript规范,由于DontDelete内部参数,无法删除某些对象属性.例如 :

var y = 5

不应该删除.但从我能够检查的 - 它是.

以下是Mozilla开发人员中心的链接:https: //developer.mozilla.org/en/JavaScript/Reference/Operators/Special/delete

任何想法为什么这不应该工作?

javascript ecma262

5
推荐指数
1
解决办法
2101
查看次数

Java和ECMA-262(AS,JS)中正则表达式之间的差异

我需要将Java正则表达式转换为Actionscript正则表达式.

显然没有任何预制转换器,所以我试图自己写一个.有没有列出所有差异的资源?

我知道regular-expressions.info,但似乎并没有全面的差异列表.

谢谢

javascript java regex actionscript-3 ecma262

5
推荐指数
1
解决办法
1873
查看次数

为什么匿名函数表达式和命名函数表达式的初始化方式如此不同?

我正在查看第13节或ECMAScript规范(第5节).匿名函数表达式初始化如下:

返回使用FormalParameterListopt指定的参数和FunctionBody指定的主体创建13.2中指定的新Function对象的结果.将正在运行的执行上下文的LexicalEnvironment作为Scope传递.如果FunctionExpression包含在严格代码中或者其FunctionBody是严格代码,则传入true作为Strict标志.

这个逻辑与初始化函数声明的方式非常相似.但是,请注意命名的funciton表达式的不同初始化方式.

  1. 让funcEnv成为调用NewDeclarativeEnvironment传递正在运行的执行上下文的Lexical Environment作为参数的结果
  2. 让envRec成为funcEnv的环境记录.
  3. 调用envRec的CreateImmutableBinding具体方法,将Identifier的String值作为参数传递.
  4. 让闭包是创建一个新的Function对象的结果,该对象在13.2中指定,其中参数由FormalParameterListopt和FunctionBody指定的body指定.传入funcEnv作为范围.如果FunctionExpression包含在严格代码中或者其FunctionBody是严格代码,则传入true作为Strict标志.
  5. 调用envRec的InitializeImmutableBinding具体方法,将Identifier和closure的String值作为参数传递.
  6. 关闭.

我知道命名/匿名函数表达式之间的一个重大区别是命名函数表达式可以在函数内递归调用,但这就是我能想到的.为什么设置如此不同?为什么需要执行这些额外的步骤?

javascript function anonymous-function ecma262 ecmascript-5

5
推荐指数
1
解决办法
649
查看次数

是否有工具来验证ECMAScript并确认它与ECMAScript语言规范第3版兼容?

我目前正在试图找出为什么JSDT发布错误,例如" 有效正则表达式上JavaScript错误 ".

在我测试时,我意识到它适用于这样的简单文件:

var a = {
    urlParseRE: /^\s*(((([^:\/#\?]+:)?(?:(\/\/)((?:(([^:@\/#\?]+)(?:\:([^:@\/#\?]+))?)@)?(([^:\/#\?\]\[]+|\[[^\/\]@#?]+\])(?:\:([0-9]+))?))?)?)?((\/?(?:[^\/\?#]+\/+)*)([^\?#]*)))?(\?[^#]+)?)(#.*)?/,
    test: b.replace(/^\/|(\/[^\/]*|[^\/]+)$/g, "")
};
Run Code Online (Sandbox Code Playgroud)

并报告jQuery.mobile-1.3.1.min.js等复杂文件的错误.

我使用在线工具来格式化模仿的jQuery脚本,然后从中删除几乎所有内容,以创建一个有助于复制问题的简单示例.当文件大小从大约3000行减少到300行时,在上面的原始文件之前发布了一些新的验证错误.我最终完成了不同问题的实验.验证错误发布在','在下面的示例中:

!function(){
    window.alert("passed 1");
}(),
function(){
    window.alert("passed 2");
}();
window.alert("passed 3");
Run Code Online (Sandbox Code Playgroud)

我知道JSDT项目已暂停一段时间并仅支持ECMAScript v3所以在我创建新问题之前我想确定最后一个简单的js示例对于ECMAScript语言规范第3版是正确的.是否有任何在线或离线工具来验证?

javascript eclipse validation ecma262

5
推荐指数
2
解决办法
4052
查看次数

ECMA-262 ReturnIfAbrupt

最近,我阅读了ECMAScript语言规范.我没有打算阅读整个规范,我只是选了一些部分.我遇到了许多问题,其中一个是这样的:

ToLength

1.Let len be ToInteger(argument).
2.ReturnIfAbrupt(len).
3.If len ? +0, then return +0.
4.Return min(len, 2^53-1).
Run Code Online (Sandbox Code Playgroud)

据我了解,它应该是这样的:

var len = ToInteger(argument); // step 1
len = ReturnIfAbrupt(len);// step 2
// step 3
if(len<=0){
    return +0; //-0 is OK too?
}
return Math.min(len, Math.pow(2,53)-1); // step 4
Run Code Online (Sandbox Code Playgroud)

我不明白ReturnIfAbrupt(len)的含义是什么,我发现了这个:

ReturnIfAbrupt

1.如果论证是一个突然完成,那么回归论证.

2.如果参数是完成记录,则让参数为参数.[[value]].

什么是突然完成,以及它与完成记录之间的区别?它们可以结合一步:如果参数是完成记录,那么返回参数.任何建议都会感激不尽!

javascript ecma262 ecmascript-6

5
推荐指数
1
解决办法
425
查看次数

什么是"呼叫环境?"

ECMA-262 5.1小节10.4.210.4.2.1涉及"呼叫上下文".这似乎没有在文档中的任何其他地方描述.

引用规范,强调我的:

10.4.2输入Eval代码

当控件进入eval代码的执行上下文时,执行以下步骤:

  1. 如果没有调用上下文或者eval代码没有通过直接调用(15.1.2.1.1)评估到eval函数那么,

10.4.2.1严格模式限制

如果调用上下文的代码或eval代码是严格代码,则eval代码无法在调用eval 的调用上下文的变量环境中实例化变量或函数绑定.相反,此类绑定在新的VariableEnvironment中实例化,该新的VariableEnvironment只能由eval代码访问.

  • 在这些段落中,"呼叫语境"是什么意思?我认为它指的是在调用之前的堆栈顶部的执行上下文eval ; 谁能验证这个?

  • 拥有"没有呼叫背景?"是什么意思?有人可以提供一个代码或条件的例子,可能导致调用eval没有调用上下文?

javascript ecma262

5
推荐指数
1
解决办法
1316
查看次数

ECMA-/Javascripts Array.prototype.forEach

Javascript(ECMAscript)Array.prototype.forEach从版本1.6(ECMAscript edition 3,2005)开始支持该方法.因此,相当多的浏览器已经支持该方法,并且与jQuery的$.each()方法相比,它的速度非常快.
(实际上它胜过所有实现,无论哪个Javascript库)

与jQuery相比,它的速度提高了约60-70%.在JSPerf 上使用forEach和jQuery自己尝试一下.

到目前为止我唯一使用它的缺点是,我无法想象早点打破迭代的方法.喜欢for,while并且do-while有一个break声明,jQuerys .each()支持return false打破循环.

我查看了ECMAScript第5版规范(我发现的最新版本),但他们没有提到从该循环中提前中断.

所以,问题,Douglas Crockford先生会称之为design error
我错过了什么,有可能提前打破这样的循环吗?

编辑

谢谢你到目前为止的答案.我想既然没有人想出一个"原生"解决方案,那真的没有实现(可能是一个功能?).无论如何,我真的不喜欢建议的方法,所以我愚弄了一点,终于找到了一个我喜欢的(至少,更好).好像:

var div     = document.createElement('div'),
divStyle    = div.style,
support     = jQuery.support,
arr         = ['MozTransform', 'WebkitTransform', 'OTransform'];

arr.slice(0).forEach(function(v,i,a){    
    if(divStyle[v] === ''){
       support.transform = v;
       a.length = 0;
    }
});
Run Code Online (Sandbox Code Playgroud)

这是"真正的"生产代码.我找了一个查找css3转换属性的好方法,我迷失了ecma5规范和奇怪的Javascript论坛:-)

因此,您可以将数组对象本身作为第三个参数传递给.forEach回调.我从原始数组创建一个副本,一旦找到我正在寻找的东西,就调用slice(0)并将其.length属性设置为0.效果很好.

如果有人提出了更好的解决方案,我当然会编辑它.

javascript jquery ecma262

4
推荐指数
1
解决办法
1241
查看次数

在Chrome中的冻结阵列上推送并弹出不会引发异常

以下代码似乎在Chrome下未按预期运行,并且在Firefox中运行方式不同.

(function () {
  'use strict';
  var
  arr = Object.freeze([1, 2, 3]);

  try {
    arr.push(4);
  } catch (e) {
    console.log(e);
  }

  try {
    console.log(arr.pop());
  }catch (e) {
    console.log(e);
  }

  console.log(arr);
})();
Run Code Online (Sandbox Code Playgroud)

我预计输出将是:

Error : (for `arr.push(4)`)
Error : (for `arr.pop()`)
[1, 2, 3]
Run Code Online (Sandbox Code Playgroud)

但是当在Chrome 29.0.1547.49(官方版本216092)beta-m上运行此代码时,我收到以下输出:

3
[1, 2, 3]
Run Code Online (Sandbox Code Playgroud)

为什么没有例外?我在Firefox Nightly 26.0a1(2013-08-12)上运行了这段代码,结果是

TypeError: arr.push(...) is not extensible
TypeError: property arr.pop(...) is non-configurable and can't be deleted
[1, 2, 3]
Run Code Online (Sandbox Code Playgroud)

正如我所料.

我想到了为什么Chrome和Firefox之间存在差异,然后我意识到这可能是因为严格的模式poppush方法.综上所述,在Firefox(SpiderMonkey)poppush方法中都是以严格模式定义的,但在Chrome(V8)中这些方法并没有在严格模式下定义.

我不知道实际的规格是什么.(我读了一些ECMA-262第5.1版,但我找不到这样的部分.)

javascript ecma262 ecmascript-5

4
推荐指数
1
解决办法
668
查看次数