使用var vs function定义函数

时间:2019-05-24 21:20:18

标签: go

导出:

var MyFunction = func(){}
function MyFunction func(){}

未导出:

var myFunction = func(){}
function myFunction func(){}

我读过var functionName = function() {} vs function functionName() {}这是关于Javascript的内容。

我考虑将其从function myFunction func(){}更改为var myFunction = func(){}的原因是后来使我更容易进行单元测试。

所以我想知道在进行此更改之前是否需要注意什么。

1 个答案:

答案 0 :(得分:0)

这两种形式的主要区别在于,它们不仅在语法上而且在它们的语义上也不同:

  • 使用func name (...)格式的“普通”格式 创建一个常规的命名函数。
  • 您所说的“使用var创建函数”实际上是在创建所谓的匿名函数并将其值分配给变量。

区别在于,在Go中,匿名函数的行为类似于 closures ,而常规函数则没有。

闭包是一种函数,它从其外部词法范围“捕获”用于函数主体的任何变量(而不会被局部变量和那里的函数参数所遮盖)。

当在包的顶层(即在任何函数的主体外部)使用这两种形式时,这种区别可能并不明显,因为在这种情况下,外部作用域是包的全局变量,而在其他函数内部区别是显而易见的:“常规”形式根本无法使用。

其他区别是您可以替换包含函数值的变量中的值,而对普通函数则不能这样做。

不过,如果我们在谈论顶级代码,Flimzy提供的建议仍然成立:在生产Go代码中,具有包含函数值的全局变量的代码是直到否则。