我正在尝试扩展Promise的功能,并且偶然发现了这种行为。我可能在做一些愚蠢的事情,但我很困惑。
为什么此代码会引发SyntaxError?
Promise.constructor.call(this, function(){})
// Throws
// Uncaught SyntaxError: Unexpected token (
// at Function (<anonymous>)
// at <anonymous>:1:21
但这很好
Promise.constructor.call(this, () => {})
答案 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:意外令牌(