异步函数
的内容时,发现了ES2017的一些类似功能。这引起了很多混淆,我想问一下:
async function
、AsyncFunction
(用于创建异步函数)和异步函数表达式(我认为只是另一个异步函数)之间有什么区别?- 在什么情况下应该使用其中一种格式?
异步函数
的内容时,发现了ES2017的一些类似功能。这引起了很多混淆,我想问一下:
async function
、 AsyncFunction
(用于创建异步函数)和异步函数表达式(我认为只是另一个异步函数)之间有什么区别?在Javascript中创建函数的方法有四种。同样,在Javascript中创建异步函数的方式也有四种,它们是彼此精确镜像。
为了演示如何工作,我使用了一个简单的全局声明的sleep
函数:
function sleep(time) {
return new Promise(function(resolve, reject) {
setTimeout(function() {
resolve();
}, time);
});
}
function speak() { return 'Hi'; }
async function speak() { await sleep(1000); return 'Hi'; }
这是声明函数最简单的方法。它只能声明一次,并被提升到当前函数作用域的顶部。
函数声明和异步函数声明完全相同,除了async
函数始终返回promise并允许您使用await
。
let speak = function() { return 'Hi'; } // anonymous function expression
let speak = function speakFn() { return 'Hi'; } // named function expression
let speak = async function() { await sleep(1000); return 'Hi'; } // anonymous asynchronous function expression
let speak = async function speakFn() { await sleep(1000); return 'Hi'; } // named asynchronous function expression
函数表达式看起来很像函数声明,但是它们不会被提升到函数作用域的顶部。你可以重新定义它们多次。它们可以在内联中定义。它们可以是匿名的,也可以是命名的:如果它们是命名的,则该名称在该函数的作用域内引用该函数。
函数表达式和异步函数表达式完全相同,只是async
函数始终返回一个 Promise,并允许你使用await
。
let speak = word => 'Hi ' + word; // one parameter
let speak = (word1, word2) => 'Hi ' + word1 + word2; // multiple parameters
let speak = async word => { await sleep(1000); return 'Hi ' + word; } // one parameter
let speak = async (word1, word2) => { await sleep(1000); return 'Hi ' + word1 + word2; } // multiple parameters
箭头函数是一种快速简洁的定义函数的方式,引入自ES2015(ES6)。它们在大多数方面与函数表达式等价,唯一的区别是箭头函数始终是匿名的且this
的值总是词法绑定的,即从外部作用域继承而来。
箭头函数和异步箭头函数完全相同,只是async
函数始终返回一个promise并允许使用await
。(它们在上述语句中略有不同,因为异步函数中每个语句都有不止一个,这意味着需要将语句包含在一个块中{}
并且return
需要明确指出。对于多于一个语句的普通箭头函数也是如此。)
let speak = new Function('word', 'return "Hi " + word;');
let speak = new AsyncFunction('word', 'await sleep(1000); return "Hi " + word;')
通过使用字符串,函数构造函数允许您动态定义函数。请注意,它们始终在全局范围内运行,并且无法访问它们定义的范围。它们仅在非常少量的情况下有用。我个人认为,异步函数构造函数永远不会是一个有用的东西。ES2017的编写者也同意我的看法,因为AsyncFunction
不是全局对象,并且必须先使用const AsyncFunction = Object.getPrototypeOf(async function(){}).constructor
获得。
使用函数构造函数创建的函数和使用匿名函数构造函数创建的函数完全相同,除了async
函数始终返回一个promise并允许您使用await
。(但您已经猜到了吧?)
function
、Function
(对象)和函数表达式
相同,唯一的区别是该函数是async
。 - Jaromanda Xfunction
、Function
(对象)和function expression
中的差异是相同的吗?我仍然很好奇是否还有其他不同之处。 - Syed Huzaifa Hassan