推荐答案
在 Dart 中,闭包是一个函数对象,它可以访问其词法作用域中的变量,即使该函数在其原始作用域之外被调用。闭包的特点包括:
- 捕获变量:闭包可以捕获并持有其词法作用域中的变量,即使这些变量在其原始作用域中已经不再存在。
- 延迟执行:闭包可以在定义它的作用域之外执行,并且仍然可以访问其捕获的变量。
- 状态保持:闭包可以保持其捕获变量的状态,即使在其原始作用域中这些变量已经发生了变化。
本题详细解读
1. 捕获变量
闭包可以捕获并持有其词法作用域中的变量。这意味着即使这些变量在其原始作用域中已经不再存在,闭包仍然可以访问它们。
Function makeAdder(int addBy) { return (int i) => addBy + i; } void main() { var add2 = makeAdder(2); print(add2(3)); // 输出 5 }
在上面的例子中,makeAdder
函数返回了一个闭包,这个闭包捕获了 addBy
变量。即使 makeAdder
函数已经执行完毕,闭包仍然可以访问 addBy
。
2. 延迟执行
闭包可以在定义它的作用域之外执行,并且仍然可以访问其捕获的变量。
-- -------------------- ---- ------- ---- ------ - --- ------- - -------- -------- ----------- - -- - --------------- -- ------- - ------- ------- -------------- -- -- ------- ------ -
在这个例子中,showMessage
闭包在 message
变量被修改后才执行,但它仍然能够访问并输出修改后的 message
值。
3. 状态保持
闭包可以保持其捕获变量的状态,即使在其原始作用域中这些变量已经发生了变化。
-- -------------------- ---- ------- -------- --------- - --- ----- - -- ------ -- - -------- ------------- -- - ---- ------ - --- --------- - ---------- ------------ -- -- - ------------ -- -- - ------------ -- -- - -
在这个例子中,counter
函数返回了一个闭包,这个闭包捕获了 count
变量。每次调用 increment
闭包时,count
的值都会增加,并且闭包保持了 count
的状态。