javascript - JS Promises/A+ 的 'catch' 方法名称是否无效,因为它是 JS 关键字?

标签 javascript promise ecmascript-5

最近开始在一个项目中使用JS Promises。我注意到每次我使用 .catch 我的 JS linter提示。它确实运行并做了它应该做的事情,但我查找了 ECMAScript spec它看起来真的是对的:因为catch is a keyword它不能用作标识符。据我了解,方法名称是标识符,因此这是无效的:

Promise.reject("Duh").catch(alert);

应该是这样的:

Promise.reject("Duh")['catch'](alert);

我错过了什么?

最佳答案

What am I missing?

属性名称不是标识符,它可以使用任何标识符名称。来自 Property Accessors 上的规范:

MemberExpression : MemberExpression . IdentifierName
CallExpression : CallExpression . IdentifierName

identifiers :

Identifier :: IdentifierName but not ReservedWord

您可以在点属性访问中使用任意标识符名称(但不能使用整数之类的东西),但不能使用 [reserved] 关键字作为标识符,例如在变量或函数名称中。

然而,这在 ES5 中确实发生了变化,回到 EcmaScript 3属性名称必须是标识符。这就是为什么如果你想支持旧版浏览器,你仍然需要对关键字使用括号表示法;这就是你的 linter 提示它的原因。 Same holds用于对象文字中的属性名称。

关于javascript - JS Promises/A+ 的 'catch' 方法名称是否无效,因为它是 JS 关键字?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25774628/

相关文章:

javascript - 使用一个参数 promise .then()

javascript - AngularJS : calling a factory method within the loop

javascript - Babel 6.0.20 模块功能在 IE8 中不起作用

javascript - 在方法中使用 Vue.js 数据属性而不将其作为参数传递是否错误?

angular - Promises 和 Observables 有什么区别?

javascript - for...in 与数组输出字符串而不是数字

javascript - 当数组元素中的逗号不会影响数组的长度时

javascript - 哪种 JavaScript OOP 设计模式最能利用(新的)ECMAScript 5 特性?

javascript - listToArray Eloquent JavaScript

javascript - 正则表达式匹配空格 - 排除多组字符之间的空格