我在尝试扩展 Promise 的功能时偶然发现了这种行为。我可能在做一些愚蠢的事情,但我很困惑。
为什么这段代码会抛出 SyntaxError?
Promise.constructor.call(this, function(){})
// Throws
// Uncaught SyntaxError: Unexpected token (
// at Function (<anonymous>)
// at <anonymous>:1:21
不过这很好
Promise.constructor.call(this, () => {})
最佳答案
首先,为了说明这一点,请注意 Promse.constructor
只是对 Function
构造函数的引用。
所以基本上你只是在调用:
Function.call(this, function () {})
和:
Function.call(this, () => {})
第一个表达式抛出,因为 function () {}
不是一个有效的函数语句(但它是一个有效的函数表达式)。
问题在于,在作用域的顶部 block 中,函数
标识符与函数声明的语句形式的语法相匹配,函数语句应该被命名(这就是错误的原因说 (
是一个“意外的标记”,解析器期望在 function
关键字和 (
字符)。
如果您确实使用名称或使用逗号运算符,它会将函数视为表达式:
console.log(Function('0,function () {}'))
console.log(Function('function test() {}'))
箭头函数没有问题,因为它们只能是表达式。
关于javascript - 为什么这会抛出 SyntaxError?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56246997/