函数
(S) 一级函数
两种语言都把函数视为一级函数成员。都允许函数当做参数传递,或者当做返回值,或者嵌套,或者闭包
嵌套函数在Javascript中可以被命名或者是匿名函数,而Go中只能是匿名函数
(D) 多返回值
Go函数可以返回多个值
Go
func hello() (string, string) {
return "hello", "world"
}
func main() {
a, b := hello()
fmt.Println(a, b)
}
Javascript不能使用多返回值的语法,我们可以做一个类似的形式
JS
function hello() {
return ["hello", "world"];
}
var [a, b] = hello();
console.log(a,b);
(S) IIFE
(译者注: Immediately Invoked Function Expression 立即调用的函数表达式)
JS
(function () {
console.log('hello');
}());
Go
func main() {
func() {
fmt.Println("Hello")
}()
}
(S) 闭包
两种语言都支持闭包,都需要注意的是当在循环中使用闭包. 以下是两种语言的示例,演示了绕过闭包/循环"陷阱"的方式:
JS (with bug)
var i = 0;
for (; i < 10 ; i++) {
setTimeout((function() {console.log(i);}),0);
}
JS (solved) (note that using for(let i=0; …
instead of var
is a more practical solution)
var i = 0;
for (; i < 10 ; i++) {
(function (i) {
setTimeout((function() {console.log(i);}),0);
}(i));
}
Go (with bug)
var wg sync.WaitGroup
wg.Add(10)
for i := 0; i < 10; i++ {
go func() {
defer wg.Done()
fmt.Println(i)
}()
}
wg.Wait()
Go (solved)
var wg sync.WaitGroup
wg.Add(10)
for i := 0; i < 10; i++ {
go func(i int) {
defer wg.Done()
fmt.Println(i)
}(i)
}
wg.Wait()