ES 2017:异步函数 vs AsyncFunction(object) vs 异步函数表达式
ES 2017: async function vs AsyncFunction(object) vs async function expression
我刚刚阅读了有关 async functions
的内容,并发现了 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
函数总是 returns 承诺并允许您使用 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
函数总是 returns 一个 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
Arrow functions 是一种定义函数的快捷方式,在 ES2015 (ES6) 中引入。它们在大多数方面等同于函数表达式,除了它们始终是匿名的并且 this
的值始终是词法绑定的,即从外部范围继承。
箭头函数和异步箭头函数完全相同,除了 async
函数总是 returns 承诺并允许您使用 await
。 (它们在上面的语句中略有不同,因为每个异步函数中都有不止一条语句。这意味着语句需要包含在块 {}
中,并且 return
需要明确. 对于不止一个语句长的普通箭头函数也是如此。)
函数构造函数
let speak = new Function('word', 'return "Hi " + word;');
let speak = new AsyncFunction('word', 'await sleep(1000); return "Hi " + word;')
函数构造函数允许您使用字符串动态定义函数。请注意,它们在全局范围内始终是 运行,并且无法访问它们定义的范围。它们仅在 a very small set of circumstances 中有用。我个人看不出异步函数构造函数有什么用处。 ES2017 的作者同意我的看法,因为 AsyncFunction
不是全局对象,必须先使用 const AsyncFunction = Object.getPrototypeOf(async function(){}).constructor
.
获取
使用函数构造函数创建的函数和使用匿名函数构造函数创建的函数完全相同,除了 async
函数总是 returns 承诺并允许您使用 await
. (但你已经猜到了,对吧?)
我刚刚阅读了有关 async functions
的内容,并发现了 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
函数总是 returns 承诺并允许您使用 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
函数总是 returns 一个 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
Arrow functions 是一种定义函数的快捷方式,在 ES2015 (ES6) 中引入。它们在大多数方面等同于函数表达式,除了它们始终是匿名的并且 this
的值始终是词法绑定的,即从外部范围继承。
箭头函数和异步箭头函数完全相同,除了 async
函数总是 returns 承诺并允许您使用 await
。 (它们在上面的语句中略有不同,因为每个异步函数中都有不止一条语句。这意味着语句需要包含在块 {}
中,并且 return
需要明确. 对于不止一个语句长的普通箭头函数也是如此。)
函数构造函数
let speak = new Function('word', 'return "Hi " + word;');
let speak = new AsyncFunction('word', 'await sleep(1000); return "Hi " + word;')
函数构造函数允许您使用字符串动态定义函数。请注意,它们在全局范围内始终是 运行,并且无法访问它们定义的范围。它们仅在 a very small set of circumstances 中有用。我个人看不出异步函数构造函数有什么用处。 ES2017 的作者同意我的看法,因为 AsyncFunction
不是全局对象,必须先使用 const AsyncFunction = Object.getPrototypeOf(async function(){}).constructor
.
使用函数构造函数创建的函数和使用匿名函数构造函数创建的函数完全相同,除了 async
函数总是 returns 承诺并允许您使用 await
. (但你已经猜到了,对吧?)