Nested Functions
Inspect one language lane at a time so line-level text and code deltas stay readable.
Diff Lane
English
0 modified sections0 code block delta0 anchor delta
Diff Lane
中文
1 modified sections0 code block delta0 anchor delta
modified嵌套函数text+4 lines, -5 lines
v1.0.5
Section Text
1
定义在源文件顶层的函数被称为全局函数。定义在函数体内的函数被称为嵌套函数。2
3
使用范围:4
5
- 嵌套函数的作用域仅限于其所在的外部函数。嵌套函数可以访问外部函数的变量和参数,但外部函数不能直接访问嵌套函数的内部变量。6
- 嵌套函数可以被外部函数调用,也可以被外部函数返回。7
8
生命周期:9
10
- 嵌套函数的生命周期与外部函数紧密相关。每次外部函数调用时,嵌套函数被创建;外部函数执行完毕后,嵌套函数通常被销毁,除非通过返回或闭包被外部引用。11
12
使用规则和注意事项:13
14
- 仅在对应外部函数中使用嵌套函数。15
- 避免过度嵌套。这会使代码结构变得复杂,难以理解和维护,因此避免过多嵌套导致代码混乱。16
- 注意闭包的使用。如果嵌套函数被返回并作为闭包使用,需要注意闭包可能会捕获外部函数的变量,导致外部函数的变量在外部函数结束后仍然被占用,从而影响内存管理。17
18
示例,函数 `foo` 内定义了一个嵌套函数 `nestAdd`,可以在 `foo` 内调用该嵌套函数 `nestAdd`,也可以将嵌套函数 `nestAdd` 作为返回值返回,在 `foo` 外对其进行调用:19
20
<!-- verify -->21
22
23
程序会输出:Code 1 · cangjie
1
func foo() {2
func nestAdd(a: Int64, b: Int64) {3
a + b + 34
}5
6
println(nestAdd(1, 2)) // 67
8
return nestAdd9
}10
11
main() {12
let f = foo()13
let x = f(1, 2)14
println("result: ${x}")15
}Code 2 · text
1
62
result: 6v1.1.0
Section Text
1
定义在源文件顶层的函数被称为全局函数。定义在函数体内的函数被称为嵌套函数。2
3
**使用范围:**4
5
- 嵌套函数的作用域仅限于其所在的外部函数。嵌套函数可以访问外部函数的变量和参数,但外部函数不能直接访问嵌套函数的内部变量。6
- 嵌套函数可以被外部函数调用,也可以被外部函数返回。7
8
**生命周期:** 嵌套函数的生命周期与外部函数紧密相关。每次外部函数调用时,嵌套函数被创建;外部函数执行完毕后,嵌套函数通常被销毁,除非通过返回或闭包被外部引用。9
10
**使用规则和注意事项:**11
12
- 仅在对应外部函数中使用嵌套函数。13
- 避免过度嵌套。这会使代码结构变得复杂,难以理解和维护,因此避免过多嵌套导致代码混乱。14
- 注意闭包的使用。如果嵌套函数被返回并作为闭包使用,需要注意闭包可能会捕获外部函数的变量,导致外部函数的变量在外部函数结束后仍然被占用,从而影响内存管理。15
16
在以下示例中,函数 `foo` 内定义了一个嵌套函数 `nestAdd`,可以在 `foo` 内调用该嵌套函数 `nestAdd`,也可以将嵌套函数 `nestAdd` 作为返回值返回,在 `foo` 外对其进行调用:17
18
<!-- verify -->19
20
21
程序会输出:Code 1 · cangjie
1
func foo() {2
func nestAdd(a: Int64, b: Int64) {3
a + b + 34
}5
6
println(nestAdd(1, 2)) // 67
8
return nestAdd9
}10
11
main() {12
let f = foo()13
let x = f(1, 2)14
println("result: ${x}")15
}Code 2 · text
1
62
result: 6