为什么这会引发SyntaxError?

时间:2019-05-21 22:16:43

标签: javascript promise

我正在尝试扩展Promise的功能,并且偶然发现了这种行为。我可能在做一些愚蠢的事情,但我很困惑。

为什么此代码会引发SyntaxError?

Promise.constructor.call(this, function(){})
// Throws
// Uncaught SyntaxError: Unexpected token (
//   at Function (<anonymous>)
//   at <anonymous>:1:21

但这很好

Promise.constructor.call(this, () => {})

2 个答案:

答案 0 :(得分:4)

首先,为了清楚起见,请注意Promse.constructor只是对Function构造函数的引用。

所以基本上您只是在打电话:

Function.call(this, function () {})

和:

Function.call(this, () => {})

抛出第一个表达式是因为function () {}不是有效的 function语句(但它是有效的函数 expression )。

问题在于,function标识符位于作用域的顶部,与函数声明的语句形式的语法匹配,应命名函数语句(这就是为什么错误表示 (是一个“意外令牌” ,它是在解析器中期望的关键字,其名称为function(字符之间。)

如果您确实使用名称或使用逗号运算符,它将把函数视为表达式:

console.log(Function('0,function () {}'))

console.log(Function('function test() {}'))

使用箭头功能没有问题,因为它们只能是表达式。

答案 1 :(得分:0)

您无法以这种方式创建匿名函数,这不是保证构造函数的问题;

function(){}
  

抛出:function(){}           ^

     

SyntaxError:意外令牌(