问题标签 [ecma262]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
javascript - 为什么匿名函数表达式和命名函数表达式的初始化如此不同?
我正在查看第 13 节或 ECMAScript 规范 (v. 5)。匿名函数表达式初始化如下:
返回创建一个新的函数对象的结果,如 13.2 中指定的,参数由 FormalParameterListopt 指定,主体由 FunctionBody 指定。传入正在运行的执行上下文的 LexicalEnvironment 作为 Scope。如果 FunctionExpression 包含在严格代码中或其 FunctionBody 是严格代码,则传入 true 作为 Strict 标志。
这个逻辑与函数声明的初始化方式非常相似。但是,请注意命名函数表达式的初始化有多么不同。
- 让 funcEnv 成为调用 NewDeclarativeEnvironment 的结果,传递运行执行上下文的词法环境作为参数
- 设 envRec 为 funcEnv 的环境记录。
- 调用 envRec 的 CreateImmutableBinding 具体方法,传入 Identifier 的 String 值作为参数。
- 让闭包是创建一个新的函数对象的结果,如 13.2 中指定的,其参数由 FormalParameterListopt 指定,主体由 FunctionBody 指定。传入 funcEnv 作为 Scope。如果 FunctionExpression 包含在严格代码中或其 FunctionBody 是严格代码,则传入 true 作为 Strict 标志。
- 调用 envRec 的 InitializeImmutableBinding 具体方法,传递 Identifier 的 String 值和闭包作为参数。
- 返回关闭。
我知道命名/匿名函数表达式之间的一大区别是命名函数表达式可以从函数内部递归调用,但这就是我能想到的。为什么设置如此不同,为什么需要执行这些额外步骤?
javascript - 非常向后兼容。每个功能
我正在数组上实现 .every 函数。我在一个旧的 javascript 引擎环境中,下面的函数并没有让编译器太高兴(Rhino)。JavaScript 的版本是 ECMA 262 标准 JavaScript 1.5。
但是,Mozilla 提供的使.ever向后兼容的代码似乎在引擎中不起作用,所以我试图实现一个更简单、功能更少的版本。因此,我想了解脚本是如何工作的,以便进行所需的调整。
我的问题; 我怎样才能实现一个极不复杂的下面的版本,它可以保证与 JS 1.5 一起工作?
javascript - 在 JavaScript 中,任何独立的内部函数是否会将“this”视为调用原始方法的对象?
在《JavaScript 启蒙》一书中(链接指向预发布版本(第 85 页),但我有已发布版本(第 6.3 章),它说了同样的话),它说任何内部函数都将this
视为全局对象( window
) 在 ECMA-3 中,但将在 ECMA-5 中修复。
代码如下:
http://jsfiddle.net/javascriptenlightenment/9GJhu/
但我认为当前的 Chrome、Firefox 和 node.js 应该在很大程度上实现了 ECMA-5,所以我在它们中尝试了上面的代码,它们仍然打印出 and 中的全局func2
对象func3
。然后我添加"use strict";
到func1
and 以防万一,还添加到func2
and func3
。代码: http: //jsfiddle.net/9GJhu/6/ 现在在 Chrome 和 node.js 中,this
将打印为undefined
,而不是myObject
. 所以按照书上的,this
应该是myObject
ECMA-5。上面的代码有什么问题?
javascript - javascript中的参数引用不一致
我最近在 JS 中遇到了一个令人讨厌的问题。
假设我们将一个映射、一个对象数组传递给函数 f。
但是,我们不能将对象的全部责任作为参数传递给函数,就像在函数范式中一样o=(function(o){return o})()
,因为没有引用对 o 的任何修改!
为什么在第二个用例中上述参考丢失和可能不同的参考处理,尽管在这两种情况下,函数都将数组参数放在 0. 位置?
javascript - 所有浏览器什么时候开始支持 String.replace(regexp, replacement_function)?
根据第 6 版JavaScript:权威指南(Flanagan,2011):
ECMAScript v3 指定替换参数
replace()
可以是函数而不是字符串。
我正在查看 2005 年编写的一些代码,其中使用了复杂的解决方法来替换部分字符串。代码的注释清楚地表明它最初使用了函数replace()
方法,但解决方法是跨浏览器兼容性所必需的。
ECMAScript v3 于 1999 年问世,据我所知(从这篇讨论文章和这篇博客文章),自 2001 年底以来,主流浏览器都支持 ECMAScript v3。可能是作者错了,还是有人能解释一下为什么在 2005 年可能需要这种变通方法?
...
更新代码作者的实际评论说:
RegExps 中的 lambda 函数目前是浏览器过多的问题。
更改代码以解决问题。
作者代码为该业务工作或运行,尽管代码本身很可能是个人项目。
javascript - 如何通过动态 ecma/javascript 表达式生成 vxml 标签
我在以下情况下遇到问题:我的 vxml 有以下代码段:
myscript.es:
评估的表达式不被视为标记,而是如下所示:添加 <break time='2000ms'/> bbb
有没有办法从 ecmascript 表达式动态生成标签?
javascript - How does the ECMA Script 5 spec allow successful parses for hex ints greater than 0xFF?
In EMCA262 version 5.1 the definition of a hexadecimal integer literal is: (document page 20, PDF page 32)
HexIntegerLiteral ::
0x
HexDigit
0X
HexDigit
HexIntegerLiteral HexDigitHexDigit :: one of
0 1 2 3 4 5 6 7 8 9 a b c d e f A B C D E F
The way I understand it an HIL can look like this:
(HIL (HIL (HIL (HIL (HIL (HIL HD))))))
An HIL can look like 0x0
(that is 0x
and a Hex Digit) and an HD can be 0
, so an HIL can be 0x00x00x00x00x00
Obviously no implementation works like this, so I'm clearly misunderstanding something. How should I interpret (in my mind) this recursive definition?
javascript - 为什么美元符号不再“仅用于机械生成的代码”?
在ECMA-262,第 3 版[PDF]中,在第 7.6 节(“标识符”,第 26 页)下,我们看到以下注释:
美元符号仅用于机械生成的代码。
这似乎是合理的。许多通常用于生成或嵌入 JavaScript 的语言都具有特殊含义$
,并且在这些语言中的 JavaScript 标识符中使用它会导致意外行为。
“机械生成的条款”出现在第 2 版中。在第 1 版中,它没有出现。从第 5 版开始,它再次消失,没有任何解释,并且在第 6 版的工作草案中仍然没有出现。
如果我不得不猜测,我会假设它最初被省略了,因为没有考虑潜在的陷阱,然后在下一个版本中添加,当它很明显会引起问题时。不过,我想不出在第 5 版中再次删除它的充分理由。
是否有任何解释从规范中包含和随后删除“机械生成的条款”(来自邮件列表、新闻组或其他地方的“书面记录”)?我在任何地方都找不到这个记录。
作为一个附带问题,任何人都可以解释在第 6 版草稿中包含零宽度字符的理由吗?考虑到您根本看不到这些字符,这似乎会造成更多麻烦,而且我想不出任何理由您希望将这些字符包含在标识符中。
更新:最初包含“机械生成的代码”注释和包含零宽度字符在下面的 codewaggle 答案中进行了解释。唯一需要回答的是这个问题的主要焦点,即删除“机械生成的代码”注释。
javascript - JavaScript 函数指针范围
这是一个关于 javascript 的学术问题。
下面的代码段接受一个整数数组,并返回一个指向函数的指针数组。指向的函数假设返回数组的平方值。
如果输入是 listOfFunction = sqFnList([1,2,3,4,5])
然后listOfFunction[0]()
应该返回 1
并且 listOfFunction[1]()
应该返回 4
但事实并非如此。
问题是 x = 25。提前感谢您的帮助。
javascript - ECMAScript 函数规范
(对不起,如果在别处回答)
我正在阅读 ECMAScript 262 规范(ECMAScript 第 5 版),并且在4.3.24 的函数中 它说如下:
注意:除了命名属性之外,函数还包含可执行代码和状态,这些代码和状态决定了它在调用时的行为方式。 函数代码可能用 ECMAScript 编写,也可能不编写。
有人可以指出或解释不能用 ECMAScript 编写函数是什么意思吗?
提前非常感谢!