这种语法怎么可能?
How is this syntax possible?
困惑:
我正在查看 async do {}
的 tc39 提案,而不是 (async()=>{})
。我试图看看我是否可以通过使用关键字来以某种方式复制它。在这里,我发现了一些奇怪的东西:
new function() {
console.log(crypto.getRandomValues(new Uint32Array(1))[0])
}
//This works but returns {}
上面的代码正常执行,但总是 return {}
。当然,总是可以使用 void 运算符:
void new function() {
console.log(crypto.getRandomValues(new Uint32Array(1))[0])
}
//This works and returns undefined
问题:
- 这个
new function() {}
是如何工作的?
- 为什么这段代码会自调用(类似于
(function(){})()
)?
- 为什么尝试将其与关键字
async
一起使用会引发错误?
这个问题在评论中得到了回答,但我想做出一个被接受的答案,这样这个问题就可以被视为“已回答”。 javascript 中的关键字 new
创建了 function/class 的新实例。一个函数,不是一个异步函数,是一个function/class的实例,允许创建它并且运行。
此代码创建相同的产品 --
function example() {
console.log('hello');
return {
process: 'finished'
}
};
new example;
-- 就像这个代码。
new function() {
console.log('hello');
return {
process: 'finished'
}
};
由于对象的构造方式,对象必须 returned。这使得它不同于 IIFE。如果对象未 returned,则产品将为空白 {}
。语法new async function() {}
不正确的原因与class { async constructor() {} }
相同。构造函数需要立即数 return 值,这会强制它们同步。
困惑:
我正在查看 async do {}
的 tc39 提案,而不是 (async()=>{})
。我试图看看我是否可以通过使用关键字来以某种方式复制它。在这里,我发现了一些奇怪的东西:
new function() {
console.log(crypto.getRandomValues(new Uint32Array(1))[0])
}
//This works but returns {}
上面的代码正常执行,但总是 return {}
。当然,总是可以使用 void 运算符:
void new function() {
console.log(crypto.getRandomValues(new Uint32Array(1))[0])
}
//This works and returns undefined
问题:
- 这个
new function() {}
是如何工作的? - 为什么这段代码会自调用(类似于
(function(){})()
)? - 为什么尝试将其与关键字
async
一起使用会引发错误?
这个问题在评论中得到了回答,但我想做出一个被接受的答案,这样这个问题就可以被视为“已回答”。 javascript 中的关键字 new
创建了 function/class 的新实例。一个函数,不是一个异步函数,是一个function/class的实例,允许创建它并且运行。
此代码创建相同的产品 --
function example() {
console.log('hello');
return {
process: 'finished'
}
};
new example;
-- 就像这个代码。
new function() {
console.log('hello');
return {
process: 'finished'
}
};
由于对象的构造方式,对象必须 returned。这使得它不同于 IIFE。如果对象未 returned,则产品将为空白 {}
。语法new async function() {}
不正确的原因与class { async constructor() {} }
相同。构造函数需要立即数 return 值,这会强制它们同步。