在 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
函数总是返回一个承诺并允许您使用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
函数总是返回一个承诺并允许您使用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
箭头功能 https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Functions/Arrow_functions是 ES2015 (ES6) 中引入的定义函数的快速而简短的方法。它们在大多数方面等同于函数表达式,除了它们始终是匿名的并且值this
总是词法绑定的,即从外部作用域继承。
箭头函数和异步箭头函数完全相同,除了async
函数总是返回一个承诺并允许您使用await
。 (它们在上面的语句中略有不同,因为每个异步函数内部都有多个语句。这意味着这些语句需要包含在一个块中{}
和return
需要明确。对于长度超过一条语句的普通箭头函数也是如此。)
函数构造函数
let speak = new Function('word', 'return "Hi " + word;');
let speak = new AsyncFunction('word', 'await sleep(1000); return "Hi " + word;')
函数构造函数允许您使用字符串动态定义函数。请注意,它们始终在全局范围内运行,并且无法访问定义它们的范围。它们仅适用于极少数情况 https://stackoverflow.com/q/3026089/417562。我个人不认为异步函数构造函数会有什么用处。 ES2017 的作者同意我的观点,因为AsyncFunction
不是全局对象,必须首先使用const AsyncFunction = Object.getPrototypeOf(async function(){}).constructor
.
使用函数构造函数创建的函数和使用匿名函数构造函数创建的函数完全相同,除了async
函数总是返回一个承诺并允许您使用await
。 (但你已经猜到了,对吧?)