是否定义了定义的匿名函数?

时间:2017-10-11 17:33:51

标签: javascript

我试图理解以下代码:

const Storage = artifacts.require("./Storage.sol");

contract('Storage', function(accounts) {
  let storage;
  before(async() => {
    storage = await Storage.deployed();
  });
  it("Set user data", async() => {
    await storage.setUserData(1, 1234);
    const data = await storage.getUserData.call(1);
    assert.equal(data, 1234, 'Return user data');
  });
});

请告诉我,我的理解是否正确。 "前"是一个函数,它接受一个没有名称的函数作为一个称为匿名函数的参数。

该匿名函数被标记为async(),这意味着它将阻塞,直到它从服务器获得返回调用。 在初始化存储变量之前,匿名函数不会返回。 之前的函数被立即调用,因为它已在另一个函数中定义。 如果它是在另一个函数之外定义的,则不会被调用,除非在"之前的单词"写在另一个函数内。
此外,也会立即调用匿名函数,因为它是在另一个函数中定义的。

谢谢!

2 个答案:

答案 0 :(得分:2)

一个简单说明:异步函数阻止。它们基于promises,因此异步函数的执行在等待期间停止,它不会阻塞线程。这是他们如此有用的原因之一。

您的问题的答案是否定,函数,匿名或其他方式不会自动调用定义。

例如:

function test() {
    () => console.log('hello')
}

除非您实际拨打test(),否则不会记录。它是否在回调中也没关系。例如,我们可以编写一个名为before()的函数:

function before(cb){
}

并传递一个匿名回调函数:

before(() => console.log("hello"))

它不会触发回调,因此从不记录控制台,显示定义没有任何反应。

但是,before()通常会接受该回调并调用它:

function before(cb){
    cb()
}

在使用cb()在before函数内部实际调用函数之前,该函数仍未执行。在最后一个示例中,我们将调用before(cb),而before将依次调用我们的回调。

答案 1 :(得分:1)

不,不会在定义上调用匿名函数。你所看到的只是一个函数表达式作为第一个参数传递给before函数。

然后before函数调用此函数作为稍后测试运行的一部分 传递给before的函数完成后,“设置用户数据”测试将运行 这是因为测试框架在每次测试之前调用before函数。

请注意,before只是测试框架自己提供的一个函数,它没有特殊的语言功能。